作为副作用影响 ESP 的 x86 指令是什么?
What are the x86 instructions that affect ESP as a side effect?
我知道 call
和 ret
会修改 esp
的值并且 push
和 pop
有很多变体,但是还有其他指令会影响堆栈指针吗?
push(a/ad/f)
和 pop(a/ad/f)
指令组正在 mod 化堆栈指针 (e)sp
。中断调用 int
也 mod 对其进行验证。指令 call
会将 return 地址压入堆栈,而 ret
将其移除。以 ret NUMBER
的形式,另外从堆栈中删除字节数以进行清理。
当然你可以在其他指令中使用(e)sp
,如mov
或算术指令如add
或sub
。它将在操作码字节、modR/M 字节、and/or sib 字节中的 REG、R/M 或 BASE 字段中表示。
以下指令将堆栈指针修改为隐式操作数1:
call
enter
int n/into/int 3
iret/iretd
leave
pop
push
ret/retf
sysenter
sysexit
pusha
popa
pushf/pushfd/pushfq
popf/popfd/popfq
vmlaunch/vmresume
eexit
每条可以编写任意通用寄存器的指令(如 imul reg, r/m32, imm8
或 add / sub)都可以根据需要编写 ESP,但仅列出其中堆栈指针是操作数的指令才有趣如果您不明确提及它。我留给你区分主要和副作用的负担。
请记住,任何能够产生异常的指令都可能修改堆栈指针,如果不是用户-space.
,至少是内核堆栈指针
我没有考虑过这样的说明,以避免使您的问题变得琐碎。
这些是我在创建此答案时通过搜索英特尔手册可以找到的所有说明。
虽然我尽了最大努力仔细检查了手册,但我不会对那个列表发誓。
1 SP
、ESP
或 RSP
.
我知道 call
和 ret
会修改 esp
的值并且 push
和 pop
有很多变体,但是还有其他指令会影响堆栈指针吗?
push(a/ad/f)
和 pop(a/ad/f)
指令组正在 mod 化堆栈指针 (e)sp
。中断调用 int
也 mod 对其进行验证。指令 call
会将 return 地址压入堆栈,而 ret
将其移除。以 ret NUMBER
的形式,另外从堆栈中删除字节数以进行清理。
当然你可以在其他指令中使用(e)sp
,如mov
或算术指令如add
或sub
。它将在操作码字节、modR/M 字节、and/or sib 字节中的 REG、R/M 或 BASE 字段中表示。
以下指令将堆栈指针修改为隐式操作数1:
call
enter
int n/into/int 3
iret/iretd
leave
pop
push
ret/retf
sysenter
sysexit
pusha
popa
pushf/pushfd/pushfq
popf/popfd/popfq
vmlaunch/vmresume
eexit
每条可以编写任意通用寄存器的指令(如 imul reg, r/m32, imm8
或 add / sub)都可以根据需要编写 ESP,但仅列出其中堆栈指针是操作数的指令才有趣如果您不明确提及它。我留给你区分主要和副作用的负担。
请记住,任何能够产生异常的指令都可能修改堆栈指针,如果不是用户-space.
,至少是内核堆栈指针
我没有考虑过这样的说明,以避免使您的问题变得琐碎。
这些是我在创建此答案时通过搜索英特尔手册可以找到的所有说明。
虽然我尽了最大努力仔细检查了手册,但我不会对那个列表发誓。
1 SP
、ESP
或 RSP
.