在 nasm 中打印斐波那契数
Print fibonacci numbers in nasm
我是汇编语言的初学者。我正在使用 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
更仔细地查看 Fibonacci
例程(或在调试器中单步执行它),您会注意到它修改了 ECX
,您依赖它作为循环计数器。
这取决于你想如何解决这个问题。你可以例如push
和 pop
ECX
在你的循环中 before/after 对 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
我是汇编语言的初学者。我正在使用 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
更仔细地查看 Fibonacci
例程(或在调试器中单步执行它),您会注意到它修改了 ECX
,您依赖它作为循环计数器。
这取决于你想如何解决这个问题。你可以例如push
和 pop
ECX
在你的循环中 before/after 对 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