2010-02-20 45 views
4

首先我明白(或我認爲我明白)未對齊堆棧的問題。彙編器堆棧對齊(或更好的與PUSH不一致的例子)

但我知道(像一個定義),將16位值推送到32位寬的堆棧可能導致堆棧未對齊。

但我不明白的事情是,這可能會發生......因爲PUSHPOP檢查段描述符處的D標誌(所以是1遞增/遞減32位並且是0 16位)。

假設D標誌= 1,應該PUSH AX做32位遞減?所以它就像我在堆棧中「錯過」16位?

我不知道我理解這個問題

回答

3

雖然兩者pushpop檢查在該段描述來確定默認操作數大小(即16或32/64位)的d位,也可以是覆蓋操作數大小覆蓋0x66

如果d位爲0,則:

ff /6 

推16位到堆棧

66 ff /6 

推動32位(或64,如果它是一個64位段)。

如果D位是1,則情況相反。

在任何情況下,ESP(或RSP或只是SP,取決於地址大小)遞增或2(對於16位操作)遞減,4(對於32位操作)或8(64位操作) 。