Assembly 作为副作用影响ESP的x86指令有哪些?

Assembly 作为副作用影响ESP的x86指令有哪些?,assembly,x86,callstack,stack-pointer,Assembly,X86,Callstack,Stack Pointer,我知道call和ret将修改esp的值,push和pop有很多变体,但是是否还有其他指令会影响堆栈指针?push(a/ad/f)和pop(a/ad/f)指令组正在修改堆栈指针(e)sp。中断调用int也会修改它。指令call将返回地址推送到堆栈,并ret将其删除。另外,以ret NUMBER的形式,从堆栈中删除字节数以清理堆栈 当然,您可以在其他指令中使用(e)sp,如mov或算术指令,如add或sub。它将在操作码的R/M或REG字段中表示。以下说明修改堆栈指针1: 呼叫 输入 int n/

我知道
call
ret
将修改
esp
的值,
push
pop
有很多变体,但是是否还有其他指令会影响堆栈指针?

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


当然,您可以在其他指令中使用
(e)sp
,如
mov
或算术指令,如
add
sub
。它将在操作码的R/M或REG字段中表示。

以下说明修改堆栈指针1:

  • 呼叫
  • 输入
  • int n/into/int 3
  • iret/iretd
  • 离开
  • pop
  • 推送
  • ret
  • sysenter
  • sysexit
  • pusha/pushad
  • popa/popad
  • pushf/pushfd/pushfq
  • popf/popfd/popfq
  • vmlaunch/vmresume
  • eexit
我把主要和副作用分开的责任留给你们

请记住,任何能够生成异常的指令都可能修改堆栈指针。
我没有考虑过这样的指示,以免把你的问题琐碎化

这些是我在创建此答案时通过搜索英特尔手册可以找到的所有说明。
虽然我尽了最大的努力仔细阅读手册,但我不会对清单发誓



1
SP
ESP
RSP

将指令
INT
插入
IRET
以及许多其他直接控制寄存器的指令,如
添加ESP,8
。有关
ESP,请搜索英特尔手册第2卷←?你试过查看手册吗?手册非常密集,弄清楚如何使用它们来回答这种类型的问题似乎超出了入门级课程的范围(这是我所处的级别)。例如,迈克尔上面的评论在这方面很有帮助。我相信一个“研究方法”类型的答案,而不是一个列表,对我和其他可能处于相同情况的初学者来说都是非常有价值的。“有一种方法可以寻找设置特定寄存器的指令”很有帮助。“RTFM”和“sort it out”与stackoverflow的观点几乎相反——特别是当所讨论的手册超过4500页且可能比较复杂时。
ENTER
LEAVE
也在修改堆栈指针,但这并不完全是“副作用”,更像是“主要影响”。