所以我正在寻找一个指令列表,这些指令隐式地执行诸如读取或写入寄存器之类的操作。明显的是
push/pop修改esp,pushad访问所有
但我相信还有更多。有人知道一个完整的列表吗?
编辑:隐式我的意思是在参数或操作码中没有明确提到的寄存器。(eflags 除外)
所以我正在寻找一个指令列表,这些指令隐式地执行诸如读取或写入寄存器之类的操作。明显的是
push/pop修改esp,pushad访问所有
但我相信还有更多。有人知道一个完整的列表吗?
编辑:隐式我的意思是在参数或操作码中没有明确提到的寄存器。(eflags 除外)
我不知道任何完整的列表,但这里(32 位/ 64 位)是一个非常有用的参考,其中包含您想要的大部分信息。
如果使用斜体设置操作数,则它是隐式操作数,未显式使用。如果操作数是用粗体设置的,它会被指令修改。
因此,例如,在MUL指令 ( AX = AL * r/m8)的 8 位版本中,它们将操作数列为AX、AL和 r/m8。请注意,前两个操作数是斜体的,因为它们是隐式的,第一个操作数是粗体的,因为它被修改了。
不幸的是,这并没有涵盖所有寄存器修改的情况。例如,MOVSD只列出了操作数的m32和m32,并没有提到ESI和EDI被取消引用然后被调整为 4的事实。
尽管如此,它几乎涵盖了所有的情况,包括: AAA,AAD,AAM,AAS,CBW,CDQ,CLTS,CMPXCHG,CMPXCHG8B,CPUID,CWD,CWDE,DAA,DAS,DIV,ENTER,IDIV,IMUL,IN,LAHF,LEAVE,LGDT,LIDT,LLDT,LMSW,LOOP,LOOPcc,MONITOR,MUL,OUT,POPA,PUSHA,RDMSR,RDPMC,RDTSC,RDTSCP,REP,SAHF,SALC,SGDT,WRMSR,以及许多 float 和 SSE 指令,以及一些没有助记符的指令。
它不(完全)涵盖其他一些内容,包括: CMPS、INS、LODS、MASKMOVDQU、MASKMOVQ、MOVS、OUTS、SCAS、STOS。一般不会提到对堆栈指针的修改。
如果你关心段寄存器,也有LDS,LES,LFS,LGS,LSS,和段前缀。然而,其他几条指令可以隐式修改段寄存器。此外,访问内存的指令会隐式访问段寄存器中的缓存信息。
注意:以上不是完整列表!
最终,您需要阅读英特尔手册才能获得官方文档,但此图表仍应为您节省大量时间。
该列表将包含指令集中的大部分指令,因为大多数指令以某种方式修改标志或寄存器('mov' 指令没有)。为条件跳转访问的标志存储在 EFLAGS 寄存器中。您可以通过查看Intel 手册找到您要查找的信息- 阅读有关每条指令操作的部分。
这是我对列表的尝试:
DAA, DAS, AAA, AAS, PUSHA, POPA, NOP, PAUSE, CBW, CWD[E], CDQ, CQO, WAIT, AAM, AAD, XLAT, JMP, LOADALL, EMMS, FINIT, CALL, RET[F], INT、INTO、RSM、PUSH、POP、ENTER、LEAVE、任何以“P”结尾的 FPU 指令...
要找到一个完整的列表,您需要进一步澄清问题。例如,有一些指令可以使用立即值修改内存。他们不访问寄存器,所以他们似乎有资格但可能不是你想要的。