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