汇编器堆栈对齐(或使用 PUSH 更好的未对齐示例)

lla*_*aro 5 x86 assembly stack

首先我了解(或者我认为我了解)堆栈未对齐的问题。

但我知道(就像定义一样)将 16 位值推入 32 位宽堆栈可能会导致堆栈未对齐。

但我不明白的是,这是如何发生的......因为PUSHPOP检查段描述符处的 D 标志(因此 1 递增/递减 32 位,0 是 16 位)。

假设D flag=1,应该PUSH AX做32bits减1吗?所以这就像我“错过”堆栈中的 16 位?

我不确定我是否理解这个问题

Nat*_*man 4

虽然两者pushpop检查段描述符中的 D 位以确定默认操作数大小(即 16 或 32/64 位),但可以使用操作数大小 override 来覆盖它0x66

如果D位为0,则:

ff /6 
Run Code Online (Sandbox Code Playgroud)

将 16 位压入堆栈

66 ff /6 
Run Code Online (Sandbox Code Playgroud)

推送 32 位(如果是 64 位段,则推送 64 位)。

如果D位为1,则相反。

在任何情况下,ESP(或RSP只是SP,取决于地址大小)递增或递减 2(对于 16 位操作)、4(对于 32 位操作)或 8(对于 64 位操作)。