在nasm中打印斐波那契数字

时间:2015-10-22 05:01:44

标签: assembly nasm fibonacci

我是汇编语言的初学者。我正在使用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

1 个答案:

答案 0 :(得分:4)

更仔细地查看Fibonacci例程(或在调试器中逐步执行),您会注意到它会修改ECX,您依赖它作为循环计数器。

取决于你想要解决的问题。你可以,例如调用push之前/之后循环中的popECX 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