Springen naar inhoud

Inline assembly in visual c++ mfc project


  • Log in om te kunnen reageren

#1

Stef31

    Stef31


  • >250 berichten
  • 609 berichten
  • Ervaren gebruiker

Geplaatst op 13 december 2007 - 15:18

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:
======================

;=====================================================================
; 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?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Stef31

    Stef31


  • >250 berichten
  • 609 berichten
  • Ervaren gebruiker

Geplaatst op 13 december 2007 - 16:52

Hier heb nu alles in Visual C++ geimplementeerd

// 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?

#3

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 13 december 2007 - 17:12

Ik heb werkelijk geen idee. :D Ik vraag me echter wel af waarom je dit wilt... daarom de volgende vraag: waarom wil je dit?

#4

Stef31

    Stef31


  • >250 berichten
  • 609 berichten
  • Ervaren gebruiker

Geplaatst op 13 december 2007 - 17:19

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

#5

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 13 december 2007 - 19:15

Weet niet precies wat je met functieprototype bedoelt, maar ik denk dat je er dit van moet maken:
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.

#6

Stef31

    Stef31


  • >250 berichten
  • 609 berichten
  • Ervaren gebruiker

Geplaatst op 14 december 2007 - 00:17

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

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

Veranderd door Stef31, 14 december 2007 - 00:18


#7

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 14 december 2007 - 09:14

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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures