; 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