2016-08-21 117 views
0

在讲座中,我们讨论了如何在汇编器中传递参数。我们区分了3种不同的机制:内存,寄存器和堆栈。 这些特性之一是:内存和寄存器不支持子程序中的递归,而堆栈则支持。为什么内存和寄存器不允许递归,而堆栈呢?

这是为什么?

我想在寄存器中,主叫/被叫的情况下保存寄存器被忽略,因此,寄存器的条目被不断改写,尽管可能需要他们为更高版本(递归)

但怎么样的记忆?

回答

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问题。

+2

当然,寄存器可以组织为堆栈(如在XTensa ISA中),或者甚至是堆栈中的一部分寄存器(例如SPARC,Itanium),其中的其他寄存器可能未被使用(或保持常量)递归部分。对于版本化的内存(通常与硬件事务内存相关联,但并不固有地绑定到这样的接口),相同的内存地址可以具有多个存储位置。 –

+0

@ PaulA.Clayton:哦好点。 x86的x87 FP寄存器堆栈也可以被递归函数使用,递归深度非常有限。 –