在講座中,我們討論瞭如何在彙編器中傳遞參數。我們區分了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
問題。
當然,寄存器可以組織爲堆棧(如在XTensa ISA中),或者甚至是堆棧中的一部分寄存器(例如SPARC,Itanium),其中的其他寄存器可能未被使用(或保持常量)遞歸部分。對於版本化的內存(通常與硬件事務內存相關聯,但並不固有地綁定到這樣的接口),相同的內存地址可以具有多個存儲位置。 –
@ PaulA.Clayton:哦好點。 x86的x87 FP寄存器堆棧也可以被遞歸函數使用,遞歸深度非常有限。 –