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