2012-02-28 48 views
2

爲什麼當你將一個值壓入堆棧時,ESP寄存器減少(而不是增加),當你彈出一個值時,ESP寄存器增加(而不是減小) ?這一點對我來說很直觀。ASM - 推動/彈出

+1

有幾次,我不得不使用一個堆棧,它*向上增長,* *對我來說非常直觀。 – harold 2012-02-28 09:20:40

回答

6

這就是因爲這種方式堆棧「從上到下」增長,反對堆,這是分配在自下而上。

在地址空間有限的架構上,這是一個設計決策,您可以更加靈活地使用它們 - 只有分配的內存區域的總和不能超過某個限制。

現在堆棧和堆地址空間總是保存在獨立的內存區域,但他們決定保持向後堆棧。

1

這或多或少是任意的設計選擇。如果堆棧指針在推動時遞增並且在彈出時遞減,則堆棧將同樣適用。在某些語言中,文字是從左到右而不是從左到右書寫的,而具體的方向並不能使語言更好或更差。

1

對於一個單一的內存系統,現在仍然存在於程序員面臨的許多環境中,您可能會從低地址向高地址增長堆棧,並且堆棧從內存高地址的頂端向下逐漸降低地址,最大限度地利用該內存而不會發生碰撞。如果他們都長大了,就需要讓他們以一種痛苦和醜陋的方式跳躍,或者儘管擁有可用的記憶,但其中一個或另一個將受到限制。在許多處理器上,您可以自由地重寫malloc或創建自己的堆棧,並使堆棧長大(某些指令集可以任意選擇,某些方式無需額外的努力就可以),堆堆放下來。儘管如此,儘管如此,堆棧還是會堆積起來並堆積起來。