3 回答

TA貢獻1853條經驗 獲得超9個贊
至于歷史的基本原理,我不能確定地說(因為我沒有設計它們)。我對此的想法是,早期的CPU會將其原始程序計數器設置為0,并且很自然地希望在另一端啟動堆棧并向下擴展,因為它們的代碼自然會向上擴展。
另外,請注意,并非所有早期的CPU 都將復位時將程序計數器設置為0 。例如,Motorola 6809將從地址中讀取程序計數器,0xfffe/f以便您可以在任意位置開始運行,具體取決于該地址提供的內容(通常但絕不限于ROM)。
歷史系統將要做的第一件事是從頂部開始掃描內存,直到找到一個位置,該位置將回讀相同的寫入值,以便它知道實際安裝的RAM(例如,具有64K地址空間的z80不一定有64K或RAM,實際上64K 在我早期很龐大。一旦找到最上面的實際地址,它將適當地設置堆棧指針,然后可以開始調用子例程。作為啟動的一部分,這種掃描通常由ROM中的CPU運行代碼完成。

TA貢獻1851條經驗 獲得超4個贊
一個可能的原因可能是它簡化了對齊。如果在堆棧上放置一個必須放在4字節邊界上的局部變量,則可以簡單地從堆棧指針中減去對象的大小,然后將兩個低位清零以獲得正確對齊的地址。如果堆棧向上生長,則確保對齊變得有些棘手。

TA貢獻2011條經驗 獲得超2個贊
再加2分:
除了提到的所有歷史依據外,我敢肯定,沒有理由在現代處理器中是有效的。所有處理器都可以采用帶符號的偏移量,并且自從我們開始處理多個線程以來,最大程度地提高堆/堆棧距離就沒有什么意義。
我個人認為這是安全設計缺陷。如果說x64體系結構的設計者會改變堆棧的增長方向,那么大多數堆棧緩沖區溢出將被消除-這是很大的事情。(因為琴弦向上生長)。
添加回答
舉報