为什么内存和寄存器不允许递归,而堆栈呢?

时间:2016-08-21 09:14:47

标签: memory recursion assembly stack cpu-registers

在讲座中,我们讨论了如何在汇编程序中传递参数。我们区分了3种不同的机制:内存,寄存器和堆栈。 其中一个特征是:Memory和Register不支持子程序中的递归,而Stack则支持递归。

为什么?

我想在寄存器的情况下,调用者/被调用者保存寄存器被忽略,因此寄存器的条目会被不断覆盖,即使稍后可能需要它们(递归)

但内存呢?

1 个答案:

答案 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的伪造指令集的问题