; Fibonacci-Zahlen
; x86 Assembler
; Wolfgang.Urban@schule.at
; berechne die n-te Fibonacci-Zahl
; erwarte n auf Stack, Rückgabe in EAX
; n hat Offset 8, da unter RET-Adresse.
; C-Konvention, Aufrufer bereinigt Stack
;
; dies entspricht in etwa dem Code, den
; der VC Compiler aus der c-Datei erzeugt!
fib1 PROC NEAR
push ESI ; universelles Register retten
mov ESI, DWORD PTR 8[ESP]; n vom Stack lesen
cmp ESI, 2 ; n mit 2 vergleichen
jg mehr ; falls größer
mov EAX,1 ; Rückgabewert in EAX
pop ESI ; wiederherstellen
ret 0 ; fertig
mehr: lea EAX,DWORD PTR [ESI-2]; n-1
push EDI ;
push EAX ; n-1 auf Stack
call fib1 ; rekursiver Aufruf
dec ESI ; n-2
mov EDI,EAX ; fib(n-1) merken
push ESI ; n-2 auf Stack
call fib1 ; rekursiver Aufruf
add ESP,8 ; Stack bereinigen
add EAX,EDI ; fib(n-1)+fib(n-2) in EAX
pop EDI ; wiederherstellen
pop ESI ; wiederherstellen
ret 0 ; fertig
fib1 ENDP
; Algorithmus 3
; 16 bit, Handarbeit
; Wolfgang.Urban@schule.at
CODE SEGMENT WORD 'CODE'
ASSUME CS:CODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; FUNCTION Fibo3
; INPUT : n in AX
; OUTPUT : F(n) im ST der FPU
;
Fibo3 PROC FAR
FLDZ ; a=0
FLD1 ; b=1
mov CX,AX
goon:
FLD ST(0) ; b b a
FADD ST,ST(2) ; a+b b a
FFREE ST(2) ; a+b b
loop goon
FSTP ST(0) ; kill ST = b
; return a in new TOS}
ret 0
Fibo3 ENDP
CODE ENDS
END