global _start
section .data
section .text
_start:
;put something for fib to calculate here
call _fib
je exit
_fib:
push ebp
mov ebp, esp
sub esp, 16 ; ...AA-A-A-ND we've built the stack frame
mov eax, [ebp+8]
cmp eax, 2
jae .recur
xor edx, edx
jmp .done
.recur:
sub eax, 2
push eax ; compute fib(n-2)
call _fib
mov [ebp-8], eax ; save returned value in 8-byte local variable...
mov [ebp-4], edx ; ...in Little-Endian byte order.
mov eax, [ebp+8] ; get argument again
dec eax
push eax ; compute fib(n-1)
call _fib
mov [ebp-16], eax ; save returned value in 8-byte local variable...
mov [ebp-12], edx ; ...in Little-Endian byte order.
; the next steps are not as efficient as they could be...
mov eax, [ebp-8]
mov edx, [ebp-4] ; retrieve 1st computed value
add eax, [ebp-16]
adc edx, [ebp-12] ; add 2nd computed value
.done:
mov esp, ebp
pop ebp
ret
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
Z2xvYmFsIF9zdGFydAoKc2VjdGlvbiAuZGF0YQoKc2VjdGlvbiAudGV4dAoKX3N0YXJ0OgoJO3B1dCBzb21ldGhpbmcgZm9yIGZpYiB0byBjYWxjdWxhdGUgaGVyZQoJY2FsbCBfZmliCglqZQkJZXhpdAoKX2ZpYjoKCXB1c2ggZWJwCiAgICBtb3YgIGVicCwgZXNwCiAgICBzdWIgIGVzcCwgMTYgICAgOyAuLi5BQS1BLUEtTkQgd2UndmUgYnVpbHQgdGhlIHN0YWNrIGZyYW1lCiAgICBtb3YgIGVheCwgW2VicCs4XQogICAgY21wICBlYXgsIDIKCWphZSAgLnJlY3VyCgl4b3IgIGVkeCwgZWR4CglqbXAgIC5kb25lCgkKLnJlY3VyOgoJc3ViICBlYXgsIDIKICAgIHB1c2ggZWF4ICAgICAgICAgICAgOyBjb21wdXRlIGZpYihuLTIpCiAgICBjYWxsIF9maWIKICAgIG1vdiAgW2VicC04XSwgZWF4ICAgOyBzYXZlIHJldHVybmVkIHZhbHVlIGluIDgtYnl0ZSBsb2NhbCB2YXJpYWJsZS4uLgogICAgbW92ICBbZWJwLTRdLCBlZHggICA7IC4uLmluIExpdHRsZS1FbmRpYW4gYnl0ZSBvcmRlci4KICAgIG1vdiAgZWF4LCBbZWJwKzhdICAgOyBnZXQgYXJndW1lbnQgYWdhaW4KICAgIGRlYyAgZWF4CiAgICBwdXNoIGVheCAgICAgICAgICAgIDsgY29tcHV0ZSBmaWIobi0xKQogICAgY2FsbCBfZmliCiAgICBtb3YgIFtlYnAtMTZdLCBlYXggIDsgc2F2ZSByZXR1cm5lZCB2YWx1ZSBpbiA4LWJ5dGUgbG9jYWwgdmFyaWFibGUuLi4KICAgIG1vdiAgW2VicC0xMl0sIGVkeCAgOyAuLi5pbiBMaXR0bGUtRW5kaWFuIGJ5dGUgb3JkZXIuCgk7IHRoZSBuZXh0IHN0ZXBzIGFyZSBub3QgYXMgZWZmaWNpZW50IGFzIHRoZXkgY291bGQgYmUuLi4KICAgIG1vdiAgZWF4LCBbZWJwLThdCiAgICBtb3YgIGVkeCwgW2VicC00XSAgIDsgcmV0cmlldmUgMXN0IGNvbXB1dGVkIHZhbHVlCiAgICBhZGQgIGVheCwgW2VicC0xNl0KICAgIGFkYyAgZWR4LCBbZWJwLTEyXSAgOyBhZGQgMm5kIGNvbXB1dGVkIHZhbHVlCgouZG9uZToKICAgIG1vdiAgZXNwLCBlYnAKICAgIHBvcCAgZWJwCiAgICByZXQKCmV4aXQ6Cgltb3YJCWVheCwgMDFoCQk7IGV4aXQoKQoJeG9yCQllYngsIGVieAkJOyBlcnJubwoJaW50CQk4MGgK