global SinusTaylor, SinusFPU ; Hiermit werden die Funktionen externen ; Programmen zugänglich gemacht SinusTaylor: push ebp ; Base Pointer retten mov ebp, esp ; Stack Pointer zum neuen Base Pointer machen ; (Bezugspunkt für Parameterübergabe festlegen) fld qword [ebp + 8] ; Parameter x in st0 laden fst qword [x] ; x abspeichern fmul qword [x] ; st0 = x^2 fmul qword [x] ; st0 = x^3 fst qword [xexp] ; aktuelle x-Potenz speichern fdiv qword [fak03] ; st0 = x^3 / 3! fchs ; st0 = -(x^3 / 3!) fst qword [bruch03] fld qword [xexp] ; st0 = x^3 fmul qword [x] ; st0 = x^4 fmul qword [x] ; st0 = x^5 fst qword [xexp] ; aktuelle x-Potenz speichern fdiv qword [fak05] ; st0 = x^5 / 5! fst qword [bruch05] fld qword [xexp] ; und so weiter für die Potenzen 7 bis 13 ... fmul qword [x] fmul qword [x] fst qword [xexp] fdiv qword [fak07] fchs fst qword [bruch07] fld qword [xexp] fmul qword [x] fmul qword [x] fst qword [xexp] fdiv qword [fak09] fst qword [bruch09] fld qword [xexp] fmul qword [x] fmul qword [x] fst qword [xexp] fdiv qword [fak11] fchs fst qword [bruch11] fld qword [xexp] fmul qword [x] fmul qword [x] fst qword [xexp] fdiv qword [fak13] fst qword [bruch13] ; alle Brüche vorbereitet! fld qword [x] ; Taylor-Summe bilden fadd qword [bruch03] fadd qword [bruch05] fadd qword [bruch07] fadd qword [bruch09] fadd qword [bruch11] fadd qword [bruch13] ; jetzt dürfte die Genauigkeit ausreichen jmp ende SinusFPU: push ebp ; Base Pointer retten mov ebp, esp ; Stack Pointer zum neuen Base Pointer machen ; (Bezugspunkt für Parameterübergabe festlegen) ; Hier beginnt der Assembler-Code. Der erste übergebene Parameter befindet sich ; auf [ebp + 8], der zweite auf [ebp + 8 + [Anzahl Bytes des Parameters]] usw. ; (4 Byte Rücksprungadresse plus 4 Byte fuer ebp) ; Beispiel: fld qword [ebp + 8]: der übergebene Parameter x ; Am Ende befindet sich der Rückgabewert im st0-Register der FPU (bei ; float-/double-Werten), ansonsten im (E)AX-Register fld qword [ebp + 8] ; Parameter x in st0 laden fsin ; sin(x) per FPU berechnen jmp ende ende: pop ebp ; Base Pointer wiederherstellen ret ; Zurück zum Rahmenprogramm [SECTION .data] ; Konstanten fak03 dq 0.6e1 ; 3! = 6 fak05 dq 1.2e2 ; 5! = 120 fak07 dq 0.504e4 ; 7! = 5040 fak09 dq 0.36288e6 ; 9! = 362880 fak11 dq 0.399168e8 ; 11! = 39916800 fak13 dq 0.62270208e10 ; 13! = 6227020800 [SECTION .bss] ; Variablen x resq 1 xexp resq 1 bruch03 resq 1 bruch05 resq 1 bruch07 resq 1 bruch09 resq 1 bruch11 resq 1 bruch13 resq 1 fakultaet resd 1