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

Memory 为什么内存和寄存器不允许递归,而堆栈允许递归?,memory,recursion,assembly,stack,cpu-registers,Memory,Recursion,Assembly,Stack,Cpu Registers,在讲座中,我们讨论了如何在汇编程序中传递参数。我们区分了3种不同的机制:内存、寄存器和堆栈。 其中一个特征是:内存和寄存器不支持子程序中的递归,而堆栈支持 为什么呢 我猜在寄存器的情况下,调用者/被调用者保存寄存器被忽略,因此寄存器的条目不断被覆盖,即使以后可能需要它们(递归) 但是内存呢?当你说内存时,似乎你在谈论静态的固定大小分配,比如全局变量。它们不能支持递归,因为它们是固定大小的,不支持指向最后一个正在使用的指针(无索引寻址)。寄存器也有这两个限制 但是,还有其他东西可以存储在内存中。e

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

为什么呢

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


但是内存呢?

当你说内存时,似乎你在谈论静态的固定大小分配,比如全局变量。它们不能支持递归,因为它们是固定大小的,不支持指向最后一个正在使用的指针(无索引寻址)。寄存器也有这两个限制

但是,还有其他东西可以存储在内存中。e、 这是记忆的一部分

您可以在一个固定大小的大型全局数组中。这与调用堆栈类似,因为当您导致堆栈溢出时,它最终会出错。(在实际系统中,调用堆栈的大小是有限的,因此无限递归函数将很快出现故障)


TL:DR:我认为你可以用任何可以在上面实现a的东西来实现递归,但是你不能用寄存器或一堆
int
global来实现



另请参见,关于OP(错误地)认为不支持调用/
ret

的编造指令集的问题,当你说内存时,似乎你在谈论静态固定大小的分配,比如全局变量。它们不能支持递归,因为它们是固定大小的,不支持指向最后一个正在使用的指针(无索引寻址)。寄存器也有这两个限制

但是,还有其他东西可以存储在内存中。e、 这是记忆的一部分

您可以在一个固定大小的大型全局数组中。这与调用堆栈类似,因为当您导致堆栈溢出时,它最终会出错。(在实际系统中,调用堆栈的大小是有限的,因此无限递归函数将很快出现故障)


TL:DR:我认为你可以用任何可以在上面实现a的东西来实现递归,但是你不能用寄存器或一堆
int
global来实现



另请参见,关于OP(错误地)认为不支持调用的组合指令集的问题,当然,寄存器可以组织为堆栈(如XTensa ISA),甚至可以组织为堆栈中的寄存器的一部分(例如SPARC、安腾),其中其他寄存器可能未使用(或保持常量)在递归部分。具有版本化内存(通常与硬件事务内存关联,但不固有地绑定到此类接口),同一个内存地址可以有多个存储位置。@PaulA.Clayton:好的一点。x86的x87 FP寄存器堆栈也可以由递归函数使用,递归深度非常有限。当然,寄存器可以组织为堆栈(如XTensa ISA),甚至可以组织为堆栈中的部分寄存器(如SPARC、安腾)其他寄存器在递归部分中可能未使用(或保持常量)。使用版本化内存(通常与硬件事务内存关联,但不固有地绑定到此类接口),同一个内存地址可以有多个存储位置。@PaulA.Clayton:哦,好的一点。x86的x87 FP寄存器堆栈也可以由递归函数使用,递归深度非常有限。