【问题标题】:Why nasm and yasm yield 67 opcode for mov r16, word [r64 - 3] instruction?为什么 nasm 和 yasm 为 mov r16, word [r64 - 3] 指令产生 67 个操作码?
【发布时间】:2018-09-03 17:45:51
【问题描述】:

在 x86-64 程序集中我有以下说明

mov        dx, word [esi-5]

Nasm 2.13.03 生成:

66 67 8B 56 FB 

yasm 1.3.0 生成:

67 66 8B 56 FB 

66 67 操作码是修饰符,因此 8B 56 FB 本身就是:

 mov        edx, dword [rsi-5]

我注意到:

66 8B 56 FB 

也计算为:

mov        dx, word [rsi-5]

我有两个问题:
1) 为什么nasm & yasm 发出这个67 操作码字节填充? (67 本身不足以将edx 减少到dx,它需要包含66)
2) 有没有办法在 nasm / yasm 中发出较短的 4 字节指令没有 67?

【问题讨论】:

  • 这些都没有意义。首先,指令以fb 结尾,85 是下一条指令的一部分。其次,即使那样,66 67 8b 46 fb 也会反汇编为mov ax, word [esi-5],这与您发布的并不完全相同。您在某处转录此内容是否有误?
  • 67 应该把地址变成 [esi-3] 没有它就会变成 [rsi-3] 所以某处有问题
  • @fuz 最后一个字节是多余的,我删除了它。无论如何,Hopper 中的 66 8B 56 FB 计算结果为 mov dx, word [rsi-3]
  • @Kamil.S 不,这不正确。 66 8b 56 fb 是 mov dx, word [rsi-5]。您在某处转录此内容时出错了吗?
  • @fuz 我不想承认,但我承认了,区别在于word [rsi-5] 与word [esi-5]

标签: assembly nasm x86-64 instruction-set yasm


【解决方案1】:

这个问题做了错误假设66 8B 56 FB

mov        dx, word [rsi-5] 

等价于

`66 67 8B 56 FB` or `67 66 8B 56 FB` 

mov        dx, word [esi-5] 

66 将edx 减少为dx
67 将[rsi-5] 减少为[esi-5]

【讨论】:

  • 顺便说一句,您可能需要movzx edx, word [rsi-5]、to avoid potential partial-register slowdowns 稍后读取 edx 或在某些 CPU 上以避免错误的依赖。另外,0xFB = 256-5。您的机器代码肯定有-5 位移,而不是-3。
  • @PeterCordes movzx 是非常巧妙的建议,非常感谢
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多