M
Size: a a a
M
IP
к
; fib(N) -> fib(N, 1, 1).
; fib(0, _, B) -> B;
; fib(N, A, B) -> fib(N-1, B, A+B).
; A B | C D -- это дата стек [A, B] и return stack [D, C]
fib/1: ; N |
fib/1[0]: ; N |
lit 1 ; N 1 |
lit 1 ; N 1 1 |
call fib/3 ; fib/3(N, 1, 1) |
ret ; fib/3(N, 1, 1) |
fib/3:
fib/3[0]: ; N A B |
rpush ; N A | B
rpush ; N | A B
dup ; N N | A B
rpop ; N N A | B
swap ; N A N | B
rpop ; N A N B |
swap ; N A B N |
lit 0 ; N A B N 0 |
eq ; N A B [0 или 1] |
jmpf fib/3[1] ; N A B
rpush ; N A | B
drop ; N | B
drop ; | B
rpop ; B |
ret ; B |
fib/3[1]: ; N A B |
rpush ; N A | B
rpush ; N | A B
lit 1 ; N 1 | A B
sub ; (N-1) | A B
rpop ; (N-1) A | B
rpop ; (N-1) A B |
swap ; (N-1) B A |
rpush ; (N-1) B | A
dup ; (N-1) B B | A
rpop ; (N-1) B B A |
swap ; (N-1) B A B |
add ; (N-1) B (A+B) |
jmp fib/3 ; (N-1) B (A+B) |
к
D
; fib(N) -> fib(N, 1, 1).
; fib(0, _, B) -> B;
; fib(N, A, B) -> fib(N-1, B, A+B).
; A B | C D -- это дата стек [A, B] и return stack [D, C]
fib/1: ; N |
fib/1[0]: ; N |
lit 1 ; N 1 |
lit 1 ; N 1 1 |
call fib/3 ; fib/3(N, 1, 1) |
ret ; fib/3(N, 1, 1) |
fib/3:
fib/3[0]: ; N A B |
rpush ; N A | B
rpush ; N | A B
dup ; N N | A B
rpop ; N N A | B
swap ; N A N | B
rpop ; N A N B |
swap ; N A B N |
lit 0 ; N A B N 0 |
eq ; N A B [0 или 1] |
jmpf fib/3[1] ; N A B
rpush ; N A | B
drop ; N | B
drop ; | B
rpop ; B |
ret ; B |
fib/3[1]: ; N A B |
rpush ; N A | B
rpush ; N | A B
lit 1 ; N 1 | A B
sub ; (N-1) | A B
rpop ; (N-1) A | B
rpop ; (N-1) A B |
swap ; (N-1) B A |
rpush ; (N-1) B | A
dup ; (N-1) B B | A
rpop ; (N-1) B B A |
swap ; (N-1) B A B |
add ; (N-1) B (A+B) |
jmp fib/3 ; (N-1) B (A+B) |
к
D
к
D
к
D
D
iload_0 // загрузка значения нулевой локальной переменной -> в данном случае аргумента
iconst_1
iconst_1
call fib/3
ret
к
к
D
D
к
D
D