push / pop修改esp,pushad访问所有
,但是我敢肯定还有更多。有人知道一个完整的列表吗?
edit:隐式地,我指的是参数或操作码中未明确提及的寄存器。 (除eflags)
#1 楼
我不知道任何完整的列表,但是这里(32位/ 64位)是一个非常有用的参考,其中包含您想要的大多数信息。请注意它们对操作数列的描述:
如果使用斜体设置操作数,则它是隐式操作数,未明确使用。如果操作数是使用粗体字设置的,则它会被指令修改。例如,在
MUL
指令的8位版本(AX = AL * r/m8
)中,它们会列出操作数如AX,AL和r / m8。请注意,前两个操作数是斜体,因为它们是隐式的,而第一个操作数是粗体的,因为它已被修改。不幸的是,这并不涵盖所有寄存器修改的情况。例如,
MOVSD
仅列出了操作数的m32和m32,而没有提及ESI
和EDI
被取消引用然后由4进行调整的事实。包括:AAA
,AAD
,AAM
,AAS
,CBW
,CDQ
,CLTS
,CMPXCHG
,CMPXCHG8B
,CPUID
,CWD
,CWDE
,DAA
,DAS
,q43120qq,q43120q79,q43120q79,q43qq,q43qq,q43qq,q43qq DIV
,ENTER
,IDIV
,IMUL
,IN
,LAHF
,LEAVE
,LGDT
,LIDT
,LLDT
,LMSW
,LOOP
,LOOPcc
,MONITOR
,MUL
,a以及OUT
,A的数量没有助记符。它没有(完全)涵盖其他一些,包括:
POPA
,PUSHA
,RDMSR
,RDPMC
,RDTSC
,RDTSCP
,REP
,SAHF
,SALC
。通常不会提到对堆栈指针的修改。如果您关心段寄存器,则还有
SGDT
,WRMSR
,CMPS
,INS
,LODS
和段前缀。但是,其他一些指令也可以隐式修改段寄存器。此外,访问内存的指令隐式地访问了段寄存器中的缓存信息。注意:以上内容不是完整列表!获取官方文档,但此图表仍应为您节省大量时间。
#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指令...
找到全面的清单将需要您进一步阐明问题。例如,有些指令使用立即数修改内存。他们不访问寄存器,因此他们似乎有资格,但可能不是您想要的。
评论
我认为一个更有趣的问题是“不访问寄存器的指令”,而jmp是我现在唯一想到的一个。条件跳转访问标志(它们是否算作寄存器?),调用/返回访问[er] sp,甚至包括movsb访问[er] di / [er] si的2条地址指令,以及[er] cx(如果它们包含rep前缀) 。或者,您的隐含含义是“在操作码/参数中未明确提及的寄存器”吗?
Guntram Blohm是的,这正是我的意思。 :)我将其添加。
顺便问一下,“ xcList”是什么?