【发布时间】:2020-10-08 03:38:19
【问题描述】:
我们来看下面的汇编指令:
add %cl,%bl
这被编码为:00cb,或0000000011001011二进制。将cb 放入 ModR/M 位域,如下所示:
1 1 0 0 1 0 1 1
+---+---+---+---+---+---+---+---+
| mod | reg | r/m |
+---+---+---+---+---+---+---+---+
而且,旅馆查找 register field here 我们得到:
- mod:
11(寄存器寻址模式) - 注册:
001(cl 注册) - r/m:
011(bl 寄存器)
而且,我相信000000ds 是add 指令,而d=s=0 因为它们都是寄存器。这是对该指令如何编码的正确理解吗?此外,对于“完整编码”方案,以下是否准确(以字节而不是位为单位):
[empty] 0x0 0b11001011 [empty] [empty] [empty]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Prefix Instruction Mod-reg-r/m Scale displacement immediate
在我尝试“解码”指令的过程中,我是否遗漏了什么?
【问题讨论】:
-
@PeterCordes 感谢您的反馈和链接。指令的编码方式非常简洁!
-
哦,我误解了他们所说的“第二个操作数”是什么意思。他们并不意味着一个顺序,并且确实提到了 r/m,r 与 r, r/m 操作数顺序由不同的操作码选择。所以这个链接实际上很好。
标签: assembly x86 intel machine-code