我知道call
并且ret
会修改 and 的值并且esp
有许多变体,但是还有其他会影响堆栈指针的指令吗?push
pop
问问题
1194 次
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要么SP
,ESP
要么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 字段中表示。add
sub
于 2017-05-23T20:29:20.920 回答