3 回答

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

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

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
再加2分:
除了提到的所有歷史依據(jù)外,我敢肯定,沒有理由在現(xiàn)代處理器中是有效的。所有處理器都可以采用帶符號(hào)的偏移量,并且自從我們開始處理多個(gè)線程以來,最大程度地提高堆/堆棧距離就沒有什么意義。
我個(gè)人認(rèn)為這是安全設(shè)計(jì)缺陷。如果說x64體系結(jié)構(gòu)的設(shè)計(jì)者會(huì)改變堆棧的增長(zhǎng)方向,那么大多數(shù)堆棧緩沖區(qū)溢出將被消除-這是很大的事情。(因?yàn)榍傧蚁蛏仙L(zhǎng))。
添加回答
舉報(bào)