了解指令编码?
Understanding Instruction Encoding?
我用了一个网站来编码这个:
movw , 4(%r8d,%esi,4)
并得到:
encoding (hex): 67 66 41 C7 44 B0 04 08 00
多亏了你,我几乎明白了除了 2 个小点:
- 这里我们将 2 个字节的立即数移动到 4 个字节的地址。他们使用了 C7 操作码,根据 table 我的意思是以下之一:
- 将 imm16 移动到 r/m16
- 将 imm32 移动到 r/m32
- mov imm32(符号扩展)到r/m64
为什么没有匹配项?
- 为什么立即数是2个字节?根据什么?
匹配成功。这是第一个“mov imm16 to r/m16”,因为助记符movw
中的w
。 r/m16
表示内存的 16 位(两个字节)正在 read/written。碰巧您正在使用 32 位有效地址来标识要写入哪两个字节的内存,但这不是 r/m16
表示法的一部分。
立即数是两个字节,因为要写入两个字节。拥有更多是没有意义的。虽然有一些例子,比如第三种情况,其中立即数比操作数的大小短,并且是零或符号扩展。
我用了一个网站来编码这个:
movw , 4(%r8d,%esi,4)
并得到:
encoding (hex): 67 66 41 C7 44 B0 04 08 00
多亏了你,我几乎明白了除了 2 个小点:
- 这里我们将 2 个字节的立即数移动到 4 个字节的地址。他们使用了 C7 操作码,根据 table 我的意思是以下之一:
- 将 imm16 移动到 r/m16
- 将 imm32 移动到 r/m32
- mov imm32(符号扩展)到r/m64
为什么没有匹配项?
- 为什么立即数是2个字节?根据什么?
匹配成功。这是第一个“mov imm16 to r/m16”,因为助记符movw
中的w
。 r/m16
表示内存的 16 位(两个字节)正在 read/written。碰巧您正在使用 32 位有效地址来标识要写入哪两个字节的内存,但这不是 r/m16
表示法的一部分。
立即数是两个字节,因为要写入两个字节。拥有更多是没有意义的。虽然有一些例子,比如第三种情况,其中立即数比操作数的大小短,并且是零或符号扩展。