例如,如果我推斧是[SP]指向我的價值斧或斧頭後的單詞?它也不同於實模式到保護模式?我問這個問題是因爲裝配藝術書中的說明和解釋是sp指向上次推送的數據,並且在該頁面上OSDev Wiki - Stack表示它指向上次推送的數據之後的空白字。x86堆棧指針指向哪裏?
回答
維基說here:
協議棧與隱式遞減(推)和 遞增(彈出)堆棧指針來實現。在16位模式下,這個隱式棧 指針被尋址爲SS:[SP],在32位模式下爲SS:[ESP],而在 64位模式下爲[RSP]。 堆棧指針實際上指向最後的 值,該值存儲爲,假設其大小將匹配 處理器的操作模式(即16,32或64位)到 與默認寬度匹配推/流行/通話/ ret指令。
這就是我的回憶存儲器說它也能工作的方式。
好的,謝謝你,但你有什麼想法,爲什麼osdev wiki在堆棧結束後說明esp。這是一個錯誤嗎? – user1180619
你可以試試。推動一些奇怪的東西,然後看看[esp]是否是相同的值。試着用幾個值來確保它不是偶然的。 –
@ user1180619:堆棧顛倒。他們從高地址開始,從那裏開始工作。不知道爲什麼,但事實就是這樣。 – Linuxios
push eax
等同於:
sub esp, 4
mov [esp], eax
因此推後,esp
將持有被推值的地址。
我想我明白爲什麼OP會問這個問題。爲什麼SP的第一個變量是8字節而不是4?
經過一番研究,我發現this這表明:
SP + 0是舊的EBP SP + 4是舊EIP(指令指針)
因此,自然,第一參數是在SP + 8。
在x86_64的堆棧點是在寄存器%RSP ,其在下部32位部分是公省著名商標作爲%ESP
作爲每李Meador的和Cory Nelson的答案,在最後一個值的堆棧指針指向該被推。
從64和IA-32架構軟件開發人員手冊卷2(2A,2B & 2C):指令集,AZ,從PUSH指令的描述中的第一行讀取如下:
減少堆棧指針,然後將源操作數存儲在堆棧頂部的 上。
- 1. 如何判斷指針是指向堆棧還是指向堆?
- 2. 添加指向堆棧的指針C
- 3. 指向堆棧
- 4. ANDing堆棧指針
- 5. 設置後幀指針指向哪裏?
- 6. 基指針和堆棧指針
- 7. 使用dwarf2獲取堆棧指針的堆棧指針值
- 8. 函數內部的指針變量指向堆棧或堆?
- 9. 使用delete之後,指針是否指向堆棧或堆?
- 10. 找出指針是指向堆棧,堆或程序文本嗎?
- 11. 堆棧幀和堆棧指針
- 12. 中斷堆棧的堆棧指針
- 13. 堆棧指針和分割
- 14. 線程堆棧指針
- 15. 堆棧指針VS應用
- 16. 彙編堆棧指針AVR
- 17. 初始化堆棧指針
- 18. 返回指令堆棧中的指針
- 19. x86彙編,堆棧推入指令
- 20. 在x86上沒有幀指針的堆棧展開
- 21. 在x86實模式下選擇堆棧指針地址(對齊)
- 22. 通過堆棧溢出重定向指令指針
- 23. 指向堆棧的C指針導致警告
- 24. C堆棧指向地址?
- 25. LocalFileSystem.PERSISTENT指向哪裏?
- 26. phpunit.xml指向哪裏?
- 27. 「this」指向哪裏?
- 28. 如何釋放指向堆中指向堆中其他對象的指針類型的指針指針類型?
- 29. 如何檢查指針是否指向iOS上的堆或堆棧內存?
- 30. x86 - CALL指令是否總是將EIP指向的地址推送到堆棧?
英特爾參考手冊包含每條指令的僞代碼。要回答你的問題,它指向堆棧中最高的值。 – DCoder