@opt stack_pointer RG @opt csr_scratch RH @use ext_std:* ; bootstrap code (must be called to setup mandatory data) ; will jump to label main @include bootstrap @label main ; call fibo subroutine with parameter 10 ldi 10 RA csi fibo hlt @label fibo ;;; subroutine fibo ;;; param RA N ;;; return RA Nth fibonacci number ; store RB, RC on stack spu RB spu RC ; if n < 2, return n subi RA 2 RA bri sign fibo_early ; store also RD on stack spu RD ; a = 0 ldi 0 RB ; b = 1 ldi 1 RC @label fibo_loop ; v = a + b add RB RC RD ; a = b mov RC RB ; b = v mov RD RC ; n -= 1 dec RA ; loop while n > 0 bri zero fibo_done jpi fibo_loop @label fibo_early ; restore used registers spo RC spo RB ; return from subroutine rsr @label fibo_done mov RD RA ; restore used registers spo RD spo RC spo RB ; return from subroutine rsr