因此,我正在寻找一系列隐式执行诸如读取或写入寄存器之类的指令的列表。显而易见的是

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

,但是我敢肯定还有更多。有人知道一个完整的列表吗?

edit:隐式地,我指的是参数或操作码中未明确提及的寄存器。 (除eflags)

评论

我认为一个更有趣的问题是“不访问寄存器的指令”,而jmp是我现在唯一想到的一个。条件跳转访问标志(它们是否算作寄存器?),调用/返回访问[er] sp,甚至包括movsb访问[er] di / [er] si的2条地址指令,以及[er] cx(如果它们包含rep前缀) 。

或者,您的隐含含义是“在操作码/参数中未明确提及的寄存器”吗?

Guntram Blohm是的,这正是我的意思。 :)我将其添加。

顺便问一下,“ xcList”是什么?

#1 楼

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

请注意它们对操作数列的描述:


如果使用斜体设置操作数,则它是隐式操作数,未明确使用。如果操作数是使用粗体字设置的,则它会被指令修改。例如,在MUL指令的8位版本(AX = AL * r/m8)中,它们会列出操作数如AX,AL和r / m8。请注意,前两个操作数是斜体,因为它们是隐式的,而第一个操作数是粗体的,因为它已被修改。

不幸的是,这并不涵盖所有寄存器修改的情况。例如,MOVSD仅列出了操作数的m32和m32,而没有提及ESIEDI被取消引用然后由4进行调整的事实。包括:AAAAADAAMAASCBWCDQCLTSCMPXCHGCMPXCHG8BCPUIDCWDCWDEDAADAS,q43120qq,q43120q79,q43120q79,q43qq,q43qq,q43qq,q43qq DIVENTERIDIVIMULINLAHFLEAVELGDTLIDTLLDTLMSWLOOPLOOPccMONITORMUL,a以及OUT,A的数量没有助记符。

它没有(完全)涵盖其他一些,包括:POPAPUSHARDMSRRDPMCRDTSCRDTSCPREPSAHFSALC。通常不会提到对堆栈指针的修改。

如果您关心段寄存器,则还有SGDTWRMSRCMPSINSLODS和段前缀。但是,其他一些指令也可以隐式修改段寄存器。此外,访问内存的指令隐式地访问了段寄存器中的缓存信息。

注意:以上内容不是完整列表!获取官方文档,但此图表仍应为您节省大量时间。

#2 楼

该列表将包含指令集中的大多数指令,因为大多数指令以某种方式修改标志或寄存器(“ mov”指令是不包含该指令的寄存器)。可进行条件跳转访问的标志存储在EFLAGS寄存器中。您可以通过阅读英特尔手册找到所需的信息-阅读有关每条指令操作的部分。

#3 楼

这是我在清单上的尝试:

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指令...

找到全面的清单将需要您进一步阐明问题。例如,有些指令使用立即数修改内存。他们不访问寄存器,因此他们似乎有资格,但可能不是您想要的。