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