我知道call
和ret
会修改esp
的值,而push
和pop
会有多种变体,但还有其他吗?会影响堆栈指针的指令吗?
答案 0 :(得分:3)
push(a/ad/f)
和pop(a/ad/f)
指令组正在修改堆栈指针(e)sp
。中断调用int
也会修改它。指令call
会将返回地址推送到堆栈,ret
将其删除。另外,以ret NUMBER
的形式从堆栈中删除字节数以清除它。
原因是您可以在其他说明中使用(e)sp
,例如mov
或算术说明,例如add
或sub
。它将在操作码的R / M或REG字段中表示。
答案 1 :(得分:3)
以下说明修改堆栈指针 1 :
enter
int n/into/int 3
iret/iretd
leave
pop
push
ret
sysenter
sysexit
pusha/pushad
popa/popad
pushf/pushfd/pushfq
popf/popfd/popfq
vmlaunch/vmresume
eexit
SP
我告诉你除了主要和副作用之外的负担。
请记住,任何能够生成异常的指令都可能会修改堆栈指针 我没有考虑过这样的说明,以避免轻视你的问题。
这些是我在创建此答案时通过搜索英特尔手册找到的所有说明 虽然我尽力审查手册,但我不会发誓。
1 ESP
,RSP
或page
。