fib:
mov eax, [esp+4]
test eax, eax
jnz .impl
mov eax, 0
mov edx, 1
ret
.impl:
push eax
sar eax, 1
push eax
call fib
mov ecx, eax
imul ecx, edx
sal ecx, 1
imul eax, eax
imul edx, edx
pop ebx
pop ebx
test ebx, 1
jz .even
.odd:
add eax, edx
add edx, ecx
ret
.even:
add edx, eax
neg eax
add eax, ecx
ret