lla*_*aro 5 x86 assembly stack
首先我了解(或者我认为我了解)堆栈未对齐的问题。
但我知道(就像定义一样)将 16 位值推入 32 位宽堆栈可能会导致堆栈未对齐。
但我不明白的是,这是如何发生的......因为PUSH
并POP
检查段描述符处的 D 标志(因此 1 递增/递减 32 位,0 是 16 位)。
假设D flag=1,应该PUSH AX
做32bits减1吗?所以这就像我“错过”堆栈中的 16 位?
我不确定我是否理解这个问题
虽然两者push
都pop
检查段描述符中的 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 位操作)。
归档时间: |
|
查看次数: |
1026 次 |
最近记录: |