2012-12-27 234 views
9

例如,如果我推斧是[SP]指向我的價值斧或斧頭後的單詞?它也不同於實模式到保護模式?我問這個問題是因爲裝配藝術書中的說明和解釋是sp指向上次推送的數據,並且在該頁面上OSDev Wiki - Stack表示它指向上次推送的數據之後的空白字。x86堆棧指針指向哪裏?

+1

英特爾參考手冊包含每條指令的僞代碼。要回答你的問題,它指向堆棧中最高的值。 – DCoder

回答

17

維基說here

協議棧與隱式遞減(推)和 遞增(彈出)堆棧指針來實現。在16位模式下,這個隱式棧 指針被尋址爲SS:[SP],在32位模式下爲SS:[ESP],而在 64位模式下爲[RSP]。 堆棧指針實際上指向最後的 值,該值存儲爲,假設其大小將匹配 處理器的操作模式(即16,32或64位)到 與默認寬度匹配推/流行/通話/ ret指令。

這就是我的回憶存儲器說它也能工作的方式。

+0

好的,謝謝你,但你有什麼想法,爲什麼osdev wiki在堆棧結束後說明esp。這是一個錯誤嗎? – user1180619

+0

你可以試試。推動一些奇怪的東西,然後看看[esp]是否是相同的值。試着用幾個值來確保它不是偶然的。 –

+0

@ user1180619:堆棧顛倒。他們從高地址開始,從那裏開始工作。不知道爲什麼,但事實就是這樣。 – Linuxios

10
push eax 

等同於:

sub esp, 4 
mov [esp], eax 

因此推後,esp將持有被推值的地址。

0

我想我明白爲什麼OP會問這個問題。爲什麼SP的第一個變量是8字節而不是4?

經過一番研究,我發現this這表明:

SP + 0是舊的EBP SP + 4是舊EIP(指令指針)

因此,自然,第一參數是在SP + 8。

-1

在x86_64的堆棧點是在寄存器%RSP ,其在下部32位部分是公省著名商標作爲%ESP

0

作爲每李Meador的和Cory Nelson的答案,在最後一個值的堆棧指針指向該被推。

從64和IA-32架構軟件開發人員手冊卷2(2A,2B & 2C):指令集,AZ,從PUSH指令的描述中的第一行讀取如下:

減少堆棧指針,然後將源操作數存儲在堆棧頂部的 上。