微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解指令编码?

如何解决了解指令编码?

我使用了一个网站来对此进行编码:

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 个字节?根据什么?

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。