2017-03-27 229 views
1

编码x86_64指令mov rcx,rdx(使用https://defuse.ca/online-x86-assembler.htm)输出48 89 D1x86_64 - 编码mov指令

检查操作码this reference显示了该字节序列如何编码该指令。

但该表中的两行(操作码8B)与指令非常相似,但操作数的顺序翻转了。
事实上,我可以使用48 8b ca(通过反编译验证)编码相同的指令。

为什么两个操作码都存在?他们的差异超过我能够解决的吗?什么时候会被另一个选中?

+1

它们的存在是为了允许内存操作数是源或目标。如果两者都是寄存器,你会得到两个编码。选择哪个取决于汇编程序,有些程序甚至允许您指定(例如gas的'.s'后缀)。 – Jester

回答

2

modr/m字节最多只能编码一个内存操作数。所有支持源或目标中的内存操作数的指令都被编码了两次,一次是源可能是内存操作数,一次是目标内存操作数。当然,这意味着您可以对两个操作数都寄存器两次的助记符进行编码。

+0

谢谢,这解释了它。当组装一个简单的mov指令(没有内存访问)时,组装者是倾向于赞成第一次编码的理由吗?这只是巧合吗? – user1000039

+1

@ user1000039取决于汇编程序。 IIRC Solaris''支持后者。 – fuz

+0

取决于汇编程序。用宏可以随意选择在你的输出中获得一些多态性。但我认为没有理由这么做。顺便说一句。这也适用于add,或者adc,sbb和sub,xor,cmp,test,xchg。 (最后两个有点不同) – sivizius