所以我正在寻找一个指令列表,这些指令隐式地执行诸如读取或写入寄存器之类的操作。明显的是
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 指令...
要找到一个完整的列表,您需要进一步澄清问题。例如,有一些指令可以使用立即值修改内存。他们不访问寄存器,所以他们似乎有资格但可能不是你想要的。