了解指令编码?

Understanding Instruction Encoding?

我用了一个网站来编码这个:

movw , 4(%r8d,%esi,4)

并得到:

encoding (hex): 67 66 41 C7 44 B0 04 08 00

多亏了你,我几乎明白了除了 2 个小点:

  1. 这里我们将 2 个字节的立即数移动到 4 个字节的地址。他们使用了 C7 操作码,根据 table 我的意思是以下之一:

为什么没有匹配项?

  1. 为什么立即数是2个字节?根据什么?

匹配成功。这是第一个“mov imm16 to r/m16”,因为助记符movw中的wr/m16 表示内存的 16 位(两个字节)正在 read/written。碰巧您正在使用 32 位有效地址来标识要写入哪两个字节的内存,但这不是 r/m16 表示法的一部分。

立即数是两个字节,因为要写入两个字节。拥有更多是没有意义的。虽然有一些例子,比如第三种情况,其中立即数比操作数的大小短,并且是零或符号扩展。