;; example of recursive function call ;; fib n ;; if n < 2 return n ;; else return fib(n - 1) + fib(n - 2) ;; many local variables are required ;; t3 = n ;; t1 = fib t3 - 1 ;; retv = fib t3 - 2 ;; retv = retv + t1 ;; r1 = input n, r2 = output retv, ;; r3 = link, r4 = sp, ;; r5 = t1, r6 = t3, ;; main() { b = fib(6) } .s b 100 sp 4 link 3 n 1 retv 2 t1 5 t3 6 .a 0 .c :main ld sp #200 ;; init sp ld n #6 jal link fib ;; call fib 3 st b retv trap stop r0 :fib st @1 sp link ;; push link st @2 sp t1 ;; push t1 st @3 sp t3 ;; push t3 add sp sp #3 sub r0 n #2 ;; n < 2 jmp GE else :then or retv n r0 ;; retv = n jmp always ret :else or t3 n r0 ;; t3 = n sub n t3 #1 ;; n - 1 jal link fib or t1 retv r0 ;; t1 = fib n - 1 sub n t3 #2 ;; n - 2 jal link fib ;; retv = fib n - 2 add retv retv t1 ;; restore locals :ret ld t3 @0 sp ld t1 @-1 sp ld link @-2 sp sub sp sp #3 jr link .e