2010-04-06 47 views
11

我已經瞭解到,您無法直接將字節推入英特爾奔騰的堆棧,有誰能向我解釋這一點嗎?爲什麼在Pentium IA-32上無法將字節壓入堆棧?

我給出的理由是因爲esp寄存器是可以字尋址的(或者,這是我們模型中的假設)並且它必須是「偶數地址」。我會假設遞減一些32位二進制數的值不會混淆寄存器的對齊,但顯然我不太瞭解。

我已經嘗試了一些NASM測試,並提出如果我聲明一個變量(咬數據庫123)並將其推到堆棧上,esp遞減4(表示它推送32位?)。但是,「推字節咬」(對不起,我選擇的變量名)將導致一個錯誤的類型:

TEST.ASM:10:錯誤:不支持非32位ELF搬遷

任何的話在這個困難時期,智慧將會受到極大的讚賞。我是大學一年級的學生,因此對於我的天真而感到抱歉。

回答

4

其基於堆棧的創建:

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

In non-64-bit modes: if the address-size and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is decremented by 4. If both attributes are 16, the 16-bit SP register (stack pointer) is decremented by 2.

來源:http://www.intel.com/Assets/PDF/manual/253667.pdf

皮克。 4-320 Vol。 2B

編輯

只是想也是一個有趣的閱讀是人工成堆的部分指出,這解釋了關於創建堆棧段進一步。

http://www.intel.com/Assets/PDF/manual/253665.pdf

章6.2

+0

非常豐富,但不幸的是,仍然超出了我現在掌握的知識。 – 2010-04-06 17:09:07

+0

@Tim - 可以理解。也許還是值得快速閱讀的。 – 2010-04-06 17:12:16

+0

等等,等等。每個內存位置都是32位寬,所以如果你推入一個值,它會將堆棧減少4個字節,因爲4 * 8是32位,如果它減少了2,那麼它會嘗試並使一個未對齊閱讀,內爆宇宙? 是嗎?如果是這樣,你可以得到的觀點,PDF是真棒(第二個)。 – 2010-04-06 17:20:23

0

堆棧指針必須是(出於某些最優化原因)4B對齊 - >它應該可以被4整除(因此,最後2位爲零)。

+0

雖然這有一定道理,Yully的回答從下往上解釋它。無論如何謝謝:) – 2010-04-06 17:00:29

8

它會使堆棧指針在某些情況下無法完成其工作。例如,可以說你有一個將一個字節壓入堆棧然後調用另一個函數的函數。該調用最終會嘗試將未對齊的返回地址寫入堆棧,導致錯誤。

+0

完美,謝謝:) – 2010-04-06 16:59:41

0

你想要做的就是使用位旋轉操作碼在每個32位存儲單元中旋轉,一次將8位放入寄存器,直到旋轉回起始位位置。現在你應該在你的32位寄存器中並排排列4個8位數據。現在把它推到堆棧上,你就完成了。

+0

對不起,這對我沒有多大意義。 – 2010-04-06 16:59:04