【问题标题】:Print fibonacci numbers in nasm在 nasm 中打印斐波那契数
【发布时间】:2016-01-21 07:12:29
【问题描述】:

我是汇编语言的初学者。我正在使用窗户。我在这里尝试使用第二个答案中的代码: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

【问题讨论】:

  • 既然您已经在考虑斐波那契数列,您可能会发现stackoverflow.com/questions/32659715/… 很有趣。那是关于一个循环的非递归实现(因为在 O(Fib(n)) 时间内计算 Fib(n) 是愚蠢的,因为你可以在 O(n) 时间内轻松计算它,甚至 O(log(n)) 时间如果你想变得更复杂)。编写一个有效的递归函数作为练习很有用,但我希望人们能选择一个递归实现实际上使事情变得更简单的例子。

标签: assembly nasm fibonacci


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2012-02-15
    • 2019-04-23
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多