汇编中的递归Fibonacci
我正在尝试在Assembly中实现递归的Fibonacci程序。但是,我的程序崩溃,有一个未处理的异常,我似乎无法找出问题。我不怀疑它涉及我对堆栈的不当使用,但我似乎无法指出哪里......
.386
.model Flat
public Fibonacci
include iosmacros.inc ;includes macros for outputting to the screen
.code
Fibonacci proc
MOV EAX, [EBP+8]
CMP EAX, 1
JA Recurse
MOV ECX, 1
JMP exit
Recurse:
DEC EAX
MOV EDX, EAX
PUSH EAX
CALL Fibonacci
ADD ESP, 4
MOV EBX, ECX
DEC EDX
PUSH EDX
CALL Fibonacci
ADD ECX, EBX
exit:
ret
Fibonacci endp
.data
end
此外,我已经推送了我用于在外部过程中将Fibonacci值转换为堆栈的数字。任何想法可能存在的想法?
没有找到相关结果
已邀请:
3 个回复
桔适丛
时,下一个操作的地址将作为返回值推送到堆栈。在创建函数时,通常习惯于创建“堆栈帧”。此框架可用于打印调用堆栈,以及局部变量和参数的偏移量。通过函数开头的两个操作创建框架:
在函数结束时,使用
删除调用堆栈,这相当于这两个操作的反向。当使用堆栈帧时,
的值存储在
中,使其指向堆栈中称为帧基的位置。因为,在这个地址之上,有
的旧值和返回地址,你通常会使用
得到第一个参数。但是,您没有设置堆栈帧。这意味着
的旧值没有被推入堆栈,并且当前的值不能用于获取参数,因为你不知道它在哪里。因此,你应该使用
得到你的论点。 此外,习惯上将返回值放在
中并且为调用者保留
。您的代码不遵循这些约定。此外,技术上不需要保留
或
的功能,所以通常你应该在调用另一个函数之前将它们推到堆栈中,如果你想保留它们的话。使用此代码,如果使用大于2的值调用,则会覆盖
和
,从而导致无效结果。 这是一个完整的列表,其中包括我提到的所有修复程序。我没有创建堆栈框架,因为它没有必要,而你的代码没有。
咳累录酬
但是您不必在堆栈上传递参数。使用寄存器更有效:
禽兢玫坞劲