
    egyptTest: SEG
               MOVE W I H'10000', SP    -- Stack setzen

               MOVE W I 0, R0           -- Fibonacci-Zahl von 0 berechnen
               CALL fib                 -- Ergebnis liegt in R1

               MOVE W I 1, R0           -- Fibonacci-Zahl von 1 berechnen
               CALL fib                 -- Ergebnis in R1

               MOVE W I 2, R0           -- Fibonacci-Zahl von 2 berechnen
               CALL fib                 -- Ergebnis in R1

               MOVE W I 5, R0           -- Fibonacci-Zahl von 5 berechnen
               CALL fib                 -- Ergebnis in R1

               MOVE W I 10, R0           -- Fibonacci-Zahl von 5 berechnen
               CALL fib                 -- Ergebnis in R1

               HALT                     -- Programmende

   -- PROC fib : berechnet rekursiv die Fibonacci-Zahl der Eingabe
   -- in: R0 : Zahl n
   -- out: R1 : Fibonacci-Zahl von n

          fib: PUSHR                    -- Register auf Stack sichern

               CMP W I 0, R0
               JNE fib_test_1
               MOVE W I 0, R1
               JUMP fib_go_back

   fib_test_1: CMP W I 1, R0
               JNE fib_greater_1
               MOVE W I 1, R1
               JUMP fib_go_back

fib_greater_1:
               MOVE W R0, R2            -- R0 (n) in R2 zwischenspeichern

               SUB W I 1, R0            -- dec (n) -> n-1
               CALL fib
               MOVE W R1, R3            -- Rückgabe von fib(n-1) in R3 speichern

               SUB W I 1, R0            -- dec (n) -> n-2
               CALL fib
               ADD W R3, R1             -- R3 auf fib(n-2) aufaddieren und fertig...

  fib_go_back: MOVE W R1, 4+!SP         -- Rückgabe des Produkts in R1 (stack cheating)
               POPR                     -- Register zurückschreiben
               RET
   -- ENDP fib

               END


