4

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

4

2 回答 2

7

以下指令将堆栈指针修改为隐式操作数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,但即使您没有明确提及,列出堆栈指针是操作数的指令也很有趣。我留给你区分主要和副作用的负担。

请记住,任何能够生成异常的指令都可能会修改堆栈指针,如果不是用户空间的话,至少是内核堆栈指针。
为了避免轻视您的问题,我没有考虑过此类说明。

这些是我在创建此答案时通过搜索英特尔手册可以找到的所有说明。
虽然我尽我最大的努力仔细检查手册,但我不会发誓那个列表。


1要么SPESP要么RSP

于 2017-05-24T07:57:29.303 回答
3

和指令push(a/ad/f)pop(a/ad/f)正在修改堆栈指针(e)sp。中断调用int也会修改它。该指令call会将返回地址压入堆栈并将ret其删除。以另外的形式ret NUMBER从堆栈中删除字节数以清理它。

当然,您可以(e)sp在其他指令中使用,例如ormov或算术指令。它将在操作码字节、modR/M 字节和/或 sib 字节的 REG、R/M 或 BASE 字段中表示。addsub

于 2017-05-23T20:29:20.920 回答