xcList 隐式访问寄存器的 x86/x64 指令

逆向工程 拆卸 x86
2021-06-26 21:45:20

所以我正在寻找一个指令列表,这些指令隐式地执行诸如读取或写入寄存器之类的操作。明显的是

push/pop修改esp,pushad访问所有

但我相信还有更多。有人知道一个完整的列表吗?

编辑:隐式我的意思是在参数或操作码中没有明确提到的寄存器。(eflags 除外)

3个回答

我不知道任何完整的列表,但这里(32 位/ 64 位)是一个非常有用的参考,其中包含您想要的大部分信息。

请注意它们操作数列描述

如果使用斜体设置操作数,则它是隐式操作数,未显式使用。如果操作数是用粗体设置的,它会被指令修改。

因此,例如,在MUL指令 ( AX = AL * r/m8)的 8 位版本中,它们将操作数列为AXAL和 r/m8。请注意,前两个操作数是斜体的,因为它们是隐式的,第一个操作数是粗体的,因为它被修改了。

不幸的是,这并没有涵盖所有寄存器修改的情况。例如,MOVSD只列出了操作数的m32m32,并没有提到ESIEDI被取消引用然后被调整为 4的事实


尽管如此,它几乎涵盖了所有的情况,包括: AAAAADAAMAASCBWCDQCLTSCMPXCHGCMPXCHG8BCPUIDCWDCWDEDAADASDIVENTERIDIVIMULINLAHFLEAVELGDTLIDTLLDTLMSWLOOPLOOPccMONITORMULOUTPOPAPUSHARDMSRRDPMCRDTSCRDTSCPREPSAHFSALCSGDTWRMSR,以及许多 float 和 SSE 指令,以及一些没有助记符的指令。

它不(完全)涵盖其他一些内容,包括: CMPSINSLODSMASKMOVDQUMASKMOVQMOVSOUTSSCASSTOS一般不会提到对堆栈指针的修改。

如果你关心段寄存器,也有LDSLESLFSLGSLSS,和段前缀。然而,其他几条指令可以隐式修改段寄存器。此外,访问内存的指令会隐式访问段寄存器中的缓存信息。

注意:以上不是完整列表!

最终,您需要阅读英特尔手册才能获得官方文档,但此图表仍应为您节省大量时间。

该列表将包含指令集中的大部分指令,因为大多数指令以某种方式修改标志或寄存器('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 指令...

要找到一个完整的列表,您需要进一步澄清问题。例如,有一些指令可以使用立即值修改内存。他们不访问寄存器,所以他们似乎有资格但可能不是你想要的。