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

Assembly 汇编程序堆栈对齐(或更好的使用PUSH的未对齐示例),assembly,x86,stack,Assembly,X86,Stack,首先,我理解(或者我认为我理解)堆栈未对齐的问题 但我知道(就像定义一样),将16位值推到32位宽的堆栈可能会导致堆栈未对齐 但我不明白的是,这是怎么发生的……因为PUSH和POP检查段描述符处的D标志(因此是1递增/递减32位,是0 16位) 假设D flag=1,是否应按AX执行32位减量?所以我好像“错过”了堆栈中的16位 我不确定我是否理解此问题当推送和弹出检查段描述符中的D位以确定默认操作数大小(即16或32/64位)时,可以使用操作数大小覆盖来覆盖它0x66 如果D位为0,则: ff

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

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

但我不明白的是,这是怎么发生的……因为
PUSH
POP
检查段描述符处的D标志(因此是1递增/递减32位,是0 16位)

假设D flag=1,是否应
按AX
执行32位减量?所以我好像“错过”了堆栈中的16位


我不确定我是否理解此问题

推送
弹出
检查段描述符中的D位以确定默认操作数大小(即16或32/64位)时,可以使用操作数大小覆盖来覆盖它
0x66

如果D位为0,则:

ff /6 
将16位推送到堆栈上

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

如果D位为1,则相反为真

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

66 ff /6