我知道call并且ret会修改 and 的值并且esp有许多变体,但是还有其他会影响堆栈指针的指令吗?pushpop
1194 次
2 回答
7
以下指令将堆栈指针修改为隐式操作数1:
callenterint n/into/int 3iret/iretdleavepoppushret/retfsysentersysexitpushapopapushf/pushfd/pushfqpopf/popfd/popfqvmlaunch/vmresumeeexit
如果您愿意,可以编写任意通用寄存器(如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 字段中表示。addsub
于 2017-05-23T20:29:20.920 回答