亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么堆棧通常會向下生長?

為什么堆棧通常會向下生長?

富國滬深 2019-10-26 13:34:08
我知道在我個人熟悉的體系結構(x86、6502等)中,堆棧通常會向下增長(即,推入堆棧的每個項目都會導致SP遞減,而不是遞增的SP)。我想知道這樣做的歷史依據。我知道,在統一的地址空間中,在數據段的另一端啟動堆棧很方便(例如),因此,如果兩側在中間碰撞,則只會有問題。但是,為什么傳統上堆棧會占據頂部呢?特別是考慮到這與“概念”模型相反的情況?(請注意,在6502架構中,即使堆棧綁定到單個256字節的頁面,堆棧也向下增長,并且這種方向選擇似乎是任意的。)
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

至于歷史的基本原理,我不能確定地說(因為我沒有設計它們)。我對此的想法是,早期的CPU會將其原始程序計數器設置為0,并且很自然地希望在另一端啟動堆棧并向下擴展,因為它們的代碼自然會向上擴展。


另外,請注意,并非所有早期的CPU 都將復位時將程序計數器設置為0 。例如,Motorola 6809將從地址中讀取程序計數器,0xfffe/f以便您可以在任意位置開始運行,具體取決于該地址提供的內容(通常但絕不限于ROM)。


歷史系統將要做的第一件事是從頂部開始掃描內存,直到找到一個位置,該位置將回讀相同的寫入值,以便它知道實際安裝的RAM(例如,具有64K地址空間的z80不一定有64K或RAM,實際上64K 在我早期很龐大。一旦找到最上面的實際地址,它將適當地設置堆棧指針,然后可以開始調用子例程。作為啟動的一部分,這種掃描通常由ROM中的CPU運行代碼完成。


查看完整回答
反對 回復 2019-10-26
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

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


查看完整回答
反對 回復 2019-10-26
?
森林海

TA貢獻2011條經驗 獲得超2個贊

再加2分:

除了提到的所有歷史依據外,我敢肯定,沒有理由在現代處理器中是有效的。所有處理器都可以采用帶符號的偏移量,并且自從我們開始處理多個線程以來,最大程度地提高堆/堆棧距離就沒有什么意義。

我個人認為這是安全設計缺陷。如果說x64體系結構的設計者會改變堆棧的增長方向,那么大多數堆棧緩沖區溢出將被消除-這是很大的事情。(因為琴弦向上生長)。


查看完整回答
反對 回復 2019-10-26
  • 3 回答
  • 0 關注
  • 1418 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號