;; fac n : ;; if n <= 0 return 1 ;; else return n * fac n - 1 ;; main : a = fac 3 ;; let r1 = a ;; let r2 = input n, r3 = output retvalue ;; let r4 = link, r5 = sp .s sp 5 link 4 a 100 .a 0 .c :main ld sp #200 ;; initialise sp ld r2 #3 jal link fac st a r3 trap stop r0 :fac ;; let t1 = n to do ;; n * fac n - 1 is ;; t1 = n ;; n = n - 1 ;; retvalue = call fac ;; retvalue = t1 * retvalue ;; save locals : r6 = t1 st @1 sp link ;; push link st @2 sp r6 ;; push t1 add sp sp #2 sub r0 r2 r0 ;; n <= 0 ? jmp GT else ld r3 #1 jmp always ret :else or r6 r2 r0 ;; t1 = n sub r2 r2 #1 ;; n - 1 jal link fac mul r3 r6 r3 ;; n * fac n - 1 :ret ;; restore ld r6 @0 sp ;; pop t1 ld link @-1 sp ;; pop link sub sp sp #2 jr link .e