【发布时间】:2014-06-24 01:13:51
【问题描述】:
所以我正在创建一个程序来给出斐波那契数列的第 n 项。我应该使用递归 MASM 程序集来实现以下逻辑。
int fib(int n){
if ((n == 1) || (n == 2))
return n - 1;
else
return fib(n-1) + fib(n-2);
}
我似乎遇到的问题是在程序循环直到达到 1 时保留这些值。我对递归相当缺乏经验,我觉得我在这方面遗漏了一些东西。我不确定如何保留这些值以添加它们。
.code
main PROC
mov ecx,0
push 4 ; calculate the nth fib
call Fib ; calculate fib (eax)
call WriteDec
call Crlf
exit
main ENDP
Fib PROC
add ecx,1
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,2 ; n == 2?
je exception2
cmp eax,1 ; n == 1?
je exception2
dec eax
push eax ; Fib(n-1)
call fib
add eax,
jmp Quit
Exception2:
dec eax
Quit:
pop ebp ; return EAX
ret 4 ; clean up stack
Fib ENDP
END main
【问题讨论】:
-
使用堆栈存储您即将修改但需要稍后恢复的寄存器的值。
-
我无法从堆栈中访问它们。我使用 push 和 [ebp] 但如果我在错误的位置推送寄存器,它会崩溃。尝试访问堆栈中以前的值只会提供随机数据,因为 ret 4 在完成一轮 fib 时会清除堆栈。
-
每个
push需要有一个对应的pop(或add esp,n,ret n,...)。如果没有确切地看到你在做什么,就很难说出问题所在。
标签: assembly recursion masm fibonacci irvine32