在讲座中,我们讨论了如何在汇编程序中传递参数。我们区分了3种不同的机制:内存,寄存器和堆栈。 其中一个特征是:Memory和Register不支持子程序中的递归,而Stack则支持递归。
为什么?
我想在寄存器的情况下,调用者/被调用者保存寄存器被忽略,因此寄存器的条目会被不断覆盖,即使稍后可能需要它们(递归)
但内存呢?
答案 0 :(得分:3)
当你说记忆时,似乎你在谈论静态固定大小的分配,比如全局变量。它们不支持递归,因为它们是固定大小的,不支持指向最后一个正在使用的指针(无索引寻址)。寄存器也有这些限制。
但是,您还可以在内存中存储其他内容。例如call stack是记忆的一部分。
你可以在一个大的固定大小的全局数组中implement recursion using a "manual" stack data structure。这就像调用堆栈,因为当你导致堆栈溢出时它最终会出错。 (在实际系统中,调用堆栈的大小有限,因此无限递归函数会很快发生段错误。)
TL:DR:我认为你可以用你可以实现stack data structure的任何东西来实现递归,但你不能用寄存器或一堆int
全局变量来实现。
另请参阅 a recent answer where I explained what recursion is in asm,关于OP(错误地)认为不支持call
/ ret
的伪造指令集的问题