-1

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

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

并得到:

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

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

  1. 在这里,我们将 2 字节立即移动到 4 字节地址。他们使用 C7 操作码,根据我的表,我的意思是以下之一:
  • 将 imm16 移动到 r/m16
  • 将 imm32 移动到 r/m32
  • mov imm32(符号扩展)到 r/m64

为什么没有匹配?

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

1 回答 1

1

有一场比赛。这是第一个“mov imm16 to r/m16”,因为w在助记符中movwr/m16表示正在读取/写入 16 位(两个字节)的内存。碰巧您正在使用 32 位有效地址来识别要写入哪两个内存字节,但这不是r/m16符号的一部分。

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

于 2021-07-31T19:27:48.897 回答