NASM中的递归:斐波那契

时间:2018-11-21 08:21:42

标签: recursion assembly x86 nasm fibonacci

我很难递归上班。好吧,递归n!阶乘计算器并不难,花了我大约半天的时间来解决。

   mov eax, [input]
   call factorialator

   jmp quit
 ;   
factorialator:
   cmp eax, 0
   je return
   push eax
   dec eax
   call factorialator
  ;
   pop eax
   imul ebx, eax
   ret
;
return:
   mov ebx, 1
   ret

现在,该函数以n = n-1进行调用,并每次将n推入n = 0(将它们全部相乘)。 轻松自在

但是现在,我不得不用(n-1)和(n-2)调用该函数,我无法想象它将如何工作,因为我必须管理返回地址,堆栈和值。我所知道的是,每当它减去1或2且结果为1时,它都应该包含一个计数器,该计数器将为我们提供结果。

以n-1返回,直到n-1 = 1,在这种情况下,返回n-2,然后再返回n-1。我只是如此感到困惑,并且一直为此努力了两天。

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

这是相同的原理。在阶乘情况下,您暂时保存N是因为以后需要用它乘以fact(N-1)
在斐波那契数列情况下,您还保存了N(或N-1 ),因为您稍后需要它来计算N-2,以便可以计算fib(N-2)

x86实现可能看起来像这样:

fib:
    cmp eax,1       ; Base case?
    jbe done        ; Yes => return n
    dec eax
    push eax        ; Save n-1 on the stack
    call fib        ; Calculate fib(n-1)
    xchg eax,[esp]  ; Place fib(n-1) on the stack, while retrieving n-1 into eax
    dec eax
    call fib        ; Calculate fib(n-2)
    add eax,[esp]   ; fib(n-2) + fib(n-1)
    add esp,4       ; "Undo" the push operation
done:
    ret