我是汇编语言的初学者。我正在使用Windows。我尝试使用第二个答案中的代码:Recursive Fibonacci in Assembly 给我第n个斐波纳契数
Fibonacci: ; computes Fib(EAX) --> EAX; do not call with EAX==0
CMP EAX, 1 ; N<=1?
JBE exit ; yes, we have the answer
DEC EAX ; = N-1
PUSH EAX ; save N-1
CALL Fibonacci ; computing FIB(n-1)to EAX
XCHG EAX,0[ESP] ; swap FIB(n-1) for saved N-1
DEC EAX ; = N-2
CALL Fibonacci ; computing FIB(N-2) to EAX
POP ECX ; = FIB(N-1)
ADD EAX,ECX ; = FIB(N-1)+FIB(N-2)
exit:
RET
该部分有效,但我无法将序列F(0)打印到F(10)
mov ecx,10
mov ebx,0
print_fib:
mov eax,ebx
call fibonacci
call print_int
inc ebx
loop print_fib
答案 0 :(得分:4)
更仔细地查看Fibonacci
例程(或在调试器中逐步执行),您会注意到它会修改ECX
,您依赖它作为循环计数器。
取决于你想要解决的问题。你可以,例如调用push
之前/之后循环中的pop
和ECX
Fibonacci
;或者您可以更改Fibonacci
以便它使用不同的寄存器:
pop edx
add eax,edx
甚至:
add eax,[esp] ; add the value at the top of the stack to eax
add esp,4 ; move the stack pointer the same distance as if we'd done pop r32