在 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,您依赖它作为循环计数器。

这取决于你想如何解决这个问题。你可以例如pushpop 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