x86_64 - 编码 mov 指令

x86_64 - encoding a mov instruction

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

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

然而,在 table(操作码 8B)中向下两行是一个非常相似的 mov 指令,但操作数的顺序翻转了。
事实上,我可以使用 48 8b ca 对相同的指令进行编码(通过反编译验证)。

为什么两个操作码都存在?它们之间的差异是否超出了我的计算范围?什么时候会选择一个而不是另一个?

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