2014-10-08 67 views
0

我有幾個關於英特爾IA-32堆棧的問題。具體做法是:英特爾堆棧增長和參考

  1. 當我push一個值壓入堆棧中,堆棧指針(%esp - size)推值的大小減小,並且該值被存儲在%esp舊值。
  2. 如果我然後想要從堆棧中讀取值而不使用pop,我需要增加堆棧指針(%esp + size)。
  3. A piece of kernel code I have是從堆棧中減去所需的大小,而不是添加它。這是我的假設,當發生這種情況時,我想要的價值是遠離指針地址,而不是朝着它。
  4. 因此,任何進一步閱讀都會挑選不良數據。

我的上述斷言是否正確?提前致謝。

+1

發佈代碼(__With Comments !!! __),以便我們可以閱讀它,看看編譯器在做什麼,以及您認爲自己想要做什麼。 – 2014-10-08 21:10:40

回答

1
  1. 錯誤,該值寫入新的%esp值。
  2. 錯誤,因爲第1點:您可以從(%esp)回讀最近的值。您需要添加到%esp以訪問較舊的項目。
  3. 該代碼只是從堆棧分配一塊內存作爲本地存儲。該塊將在稍後填寫。
  4. 不確定你的意思。
1

根據the IA-32 specification,PUSH降低堆棧指針,然後存儲在%esp位置的值。因此,讀取沒有的值將只讀取當前值%esp指向的值。