作为副作用影响 ESP 的 x86 指令是什么?

What are the x86 instructions that affect ESP as a side effect?

我知道 callret 会修改 esp 的值并且 pushpop 有很多变体,但是还有其他指令会影响堆栈指针吗?

push(a/ad/f)pop(a/ad/f) 指令组正在 mod 化堆栈指针 (e)sp。中断调用 int 也 mod 对其进行验证。指令 call 会将 return 地址压入堆栈,而 ret 将其移除。以 ret NUMBER 的形式,另外从堆栈中删除字节数以进行清理。

当然你可以在其他指令中使用(e)sp,如mov或算术指令如addsub。它将在操作码字节、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 SPESPRSP.