; printf("%d\n", fib(10)) ; exit; ; int fib(int n){ ; if (n < 2) ; return 1; ; return fib(n-1) + fib(n-2) ; ; } LDI r24, 10 LDI r31, hi8(pm(fib)) LDI r30, lo8(pm(fib)) ICALL MOV r26, r24 LDI r24, 1 ; print "%d\n" LDI r31, 0x70 LDI r30, 0x00 ICALL LDI r24, 0 ; exit LDI r31, 0x70 LDI r30, 0x00 ICALL fib: ; if (n < 2) return 1; LDI r16, 1 SUB r16, r24 BRBS 2, L1 LDI r24, 1 RET L1: ; save n on stack PUSH r24 ; calculate fib(n-1) LDI r16, 1 SUB r24, r16 LDI r31, hi8(pm(fib)) LDI r30, lo8(pm(fib)) ICALL ; recover n and save fib(n-1) to stack POP r16 PUSH r24 MOV r24, r16 ; calculate fib(n-2) LDI r16, 2 SUB r24, r16 LDI r31, hi8(pm(fib)) LDI r30, lo8(pm(fib)) ICALL ; recover fib(n-1) POP r16 ADD r24, r16 ; return fib(n-1)+fib(n-2) RET