Stef31
Artikelen: 0
Berichten: 609
Lid geworden op: do 05 jul 2007, 12:29

Inline assembly in visual c++ mfc project

Hallo iedereen,

Ik weet heel goed hoe ik een Visual C++ DLL moet schrijven maar weet niet goed hoe ik het prototype moet opstellen bij een assembler subroutine die ik heb geschreven in assembler.

Dit moet ik gaan omzetten in inline assembler en moet je bepaalde dingen wijzigen t.o.v gewone assembler taal

Dat is mijn assembler subroutine:

======================

Code: Selecteer alles

;=====================================================================

; PAGE .132

; TITLE : Sinus, Cosinus tabel

; Bepaal de sinus en cosinus van een hoek door een lookup table

; Invoer : AX = Hoek (O tot 360)

; Uitvoer: BX = Sinus en Cosinus van een hoek (magnitude en sign form

;=====================================================================

DATA SEGMENT

SINUS_TABLE

DW	0, 175, 349, 523, 698, 872	; 0-5°

DW	1045, 1219, 1392, 1564, 1736	; 6-10°

DW	2908, 2079, 2250, 2419, 2588	; 11-15°

DW	2756, 2924, 3090, 3256, 3420	; 16-20°

DW	3584, 3746, 3907, 4067, 4226	; 21-25°

DW	4384, 4550, 4695, 4848, 5000	; 26-30°

DW	5150, 5299, 5446, 5592, 5736	; 31-35°

DW	5878, 6018, 6157, 6293, 6428	; 36-40°

DW	6561, 6691, 6820, 6947, 7071	; 41-45°

DW	7193, 7313, 7431, 7547, 7660	; 46-50°

DW	7771, 7880, 7986, 8090, 8191	; 51-55°

DW	8290, 8387, 8480, 8572, 8660	; 56-60°

DW	8746, 8829, 8910, 8988, 9063	; 61-65°

DW	9135, 9205, 9272, 9336, 9397	; 66-70°

DW	9455, 9511, 9563, 9613, 9659	; 71-75°

DW	9703, 9744, 9781, 9816, 9848	; 76-80°

DW	9877, 9903, 9926, 9945, 9962	; 80-85°

DW	9976, 9986, 9994, 9998, 10000	; 86-90°

ENDS

STACK SEGMENT

DW   128  dup(0)

ENDS

CODE SEGMENT

ZOEK_SINUS	PROC	FAR

;===============================================

; Veiligstellen van de registers van oproepende

; programma

;===============================================

push	ds

push	ax

push	cx

;===============================================

; Initialisatie van data segment

;===============================================

mov 	ds, DATA

mov		ds, bx

;===============================================

; Initialisatie van de tekenbit

;===============================================

sub		cx, cx

; tekenbit := 0

;===============================================

; Is de hoek kleiner dan 180° ?

; True  : tekenbit op 0 zetten

; False : zet tekenbit op 1

;===============================================

cmp		ax, 181

; hoek < 180° ?

jb		SIN_POSITIEF	; Ja : tekenbit := 0

mov		cx, 8000h		; Neen : tekenbit := 1

sub		ax, 180

; maak verschil van 180 van de hoek

;===============================================

; De Sinus is positief

; Is de hoek kleiner dan 90° ?

; True  : Haal de sinuswaarde op

; False : Trek de hoek af van 180°

;===============================================

SIN_POSITIEF:	cmp		ax, 91

; hoek < 90°

jb		GET_SINUS		; haal de sinuswaarde op

neg		ax

; neen trek hoek af van 180

add		ax, 180

; eerst 2c nemen en dan +180

;===============================================

; Ophalen van de sinuswaarde van de lookup table

;===============================================

GET_SINUS:		mov		bx, ax

; maak van hoek wordindex

shl		bx, 1

; vermenigvuldig met 2^1

mov		bx, SINUS_TABLE[bx]; ophalen uit lookup table

or		bx, cx

; zet sinus met tb

;===============================================

; Alles terugzetten in de oorspronkelijke staat

; Alle registers van de stack afhalen

;===============================================

pop		cx

pop		ax

pop		ds

ret

ZOEK_SINUS	ENDP

ENDS

END
Kan iemand hier mij helpen want we hebben daar niet veel van gekregen in digitale 4 hoe je dat moet aanpakken?
Stef31
Artikelen: 0
Berichten: 609
Lid geworden op: do 05 jul 2007, 12:29

Re: Inline assembly in visual c++ mfc project

Hier heb nu alles in Visual C++ geimplementeerd

Code: Selecteer alles

// libTrigoTable.cpp : Defines the entry point for the DLL application.

//

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,

   DWORD  ul_reason_for_call,

   LPVOID lpReserved

 )

{

return TRUE;

}

int ZoekSinus(int table[])

{

_asm

{

;===============================================

; Veiligstellen van de registers van oproepende

; programma

;===============================================

push	ds

push	eax

push	ecx

;===============================================

; Initialisatie van de tekenbit

;===============================================

sub		ecx, ecx

; tekenbit := 0

;===============================================

; Is de hoek kleiner dan 180° ?

; True  : tekenbit op 0 zetten

; False : zet tekenbit op 1

;===============================================

cmp		eax, 181		; hoek < 180° ?

jb		SIN_POSITIEF	; Ja : tekenbit := 0

mov		ecx, 8000h		; Neen : tekenbit := 1

sub		eax, 180		; maak verschil van 180 van de hoek

;===============================================

; De Sinus is positief

; Is de hoek kleiner dan 90° ?

; True  : Haal de sinuswaarde op

; False : Trek de hoek af van 180°

;===============================================

SIN_POSITIEF:	cmp		eax, 91

; hoek < 90°

jb		GET_SINUS		; haal de sinuswaarde op

neg		eax

; neen trek hoek af van 180

add		eax, 180		; eerst 2c nemen en dan +180

;===============================================

; Ophalen van de sinuswaarde van de lookup table

;===============================================

GET_SINUS:		mov		ebx, eax		; maak van hoek wordindex

shl		ebx, 1

; vermenigvuldig met 2^1

mov		ebx, SINUS_TABLE[ebx]; ophalen uit lookup table

or		ebx, ecx		; zet sinus met tb

;===============================================

; Alles terugzetten in de oorspronkelijke staat

; Alle registers van de stack afhalen

;===============================================

pop		ecx

pop		eax

pop		ds

}

return(0);

}
Mijn vraag is nu wat moet ik hier aanpassen in de code en welke functie prototype moet ik gaan opstellen?
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Inline assembly in visual c++ mfc project

Ik heb werkelijk geen idee. :D Ik vraag me echter wel af waarom je dit wilt... daarom de volgende vraag: waarom wil je dit?
Stef31
Artikelen: 0
Berichten: 609
Lid geworden op: do 05 jul 2007, 12:29

Re: Inline assembly in visual c++ mfc project

Hallo

Ik ben student aan de hoge school in IWT in oostende en we moeten een project maken met een mengeling van C++ en assembly language dit moet erin zitten das gewoon onze opdracht en we mogen gebruik maken van internet, forums, ervaringen met andere studenten enz we moeten gewoon zorgen dat het project werkt

Ik wil gewoon weten wat ik moet wijzigen en bijvoegen in mijn inline assembler code en welk prototype van functie ik nodig heb, dus de returnwaarde, de input parameters dat ik tenminste die DLL kan compileren en gebruiken in mijn project

Graag wil ik weten hoe ik dit prototype in elkaar steek en wat ik moet veranderen in mijn assembly code?

Met vriendelijke groeten

Stephane
Gebruikersavatar
Rogier
Artikelen: 0
Berichten: 5.679
Lid geworden op: di 27 apr 2004, 13:40

Re: Inline assembly in visual c++ mfc project

Weet niet precies wat je met functieprototype bedoelt, maar ik denk dat je er dit van moet maken:

Code: Selecteer alles

extern "C" __declspec(dllexport) int ZoekSinus( int *tabel )


Wat betreft je asm code: die or ebx, ecx op het eind lijkt me niet goed (dat is althans niet de manier om ebx negatief te maken). Vervolgens kun je het resultaat in een int op de stack doen met mov [tmp],ebx (wel bovenaan je functie voor het asm gedeelte even een int tmp; declareren) en op het eind return tmp;
In theory, there's no difference between theory and practice. In practice, there is.
Stef31
Artikelen: 0
Berichten: 609
Lid geworden op: do 05 jul 2007, 12:29

Re: Inline assembly in visual c++ mfc project

Snap het nu wel maar waar zet je dan die laatste instructie "mov [tmp],ebx " en wat doe je met die instructies?

Code: Selecteer alles

mov ebx, SINUS_TABLE[ebx]; ophalen uit lookup table

or	ebx, ecx	; zet sinus met tb

mov SINUS_TABLE[ebx], ecx

mov [temp],ebx
Kan je eens de wijziging geven waar ik dat moet doen ben ook maar beginner en je weet hoe dat gaat op school he
Gebruikersavatar
Rogier
Artikelen: 0
Berichten: 5.679
Lid geworden op: di 27 apr 2004, 13:40

Re: Inline assembly in visual c++ mfc project

Op het eind, voor de drie pops, wanneer het resultaat wat je wilt returnen in ebx zit.

En in je reply doe je mov SINUS_TABLE[ebx], ecx maar dat lijkt me zeker niet de bedoeling.
In theory, there's no difference between theory and practice. In practice, there is.

Terug naar “Informatica en programmeren”