main: locals 0 1 push_int 12 store_var 0 1 # a = 12 push_var 0 1 put put_str "! = " push_var 0 1 set_arg 1 call -1 fact # f(a) put put_nl ret fact: locals 1 0 push_arg 0 1 set_arg 1 push_int 1 set_arg 2 call -1 fact_tail # fact_tail(n, 1) ret fact_tail: locals 2 0 push_arg 0 1 push_int 0 jeq L1 # n == 0 jump L2 L1: push_arg 0 2 ret L2: push_arg 0 1 push_int 1 sub # n - 1 push_arg 0 1 push_arg 0 2 mult # n * f store_arg 0 2 store_arg 0 1 jump fact_tail # fact_tail(n - 1, n * f)