【问题标题】:Difference between MOVZX r32, r/m16 and MOVZX r64, r/m16 in 64-bit x86MOVZX r32, r/m16 和 MOVZX r64, r/m16 在 64 位 x86 中的区别
【发布时间】:2020-04-23 15:25:56
【问题描述】:

MOVZX r32, r/m16 和 MOVZX r64, r/m16 都有操作码 0F B7,但后者有一个 REX.W 前缀。这两条指令有何不同?无论如何,它们都不应该将目标操作数的高 32 位归零,因为根据

Intel 64 and IA-32 Architectures - Software Developer’s Manual, Volume 1, 3.4.1.1
    : General-Purpose Registers in 64-Bit Mode.

以下陈述成立:

32-bit operands generate a 32-bit result,
    zero-extended to a 64-bit result in the destination general-purpose register.

【问题讨论】:

  • 我想这是“REX.W 前缀在这里是合法的,但实际上并没有任何作用”的交易之一。

标签: assembly x86 64-bit x86-64


【解决方案1】:

这两条指令的作用没有区别,只是它们的编码方式不同。这与 XOR EAX、EAX 和 XOR RAX、RAX 做同样的事情没有什么不同,但前者短了一个字节。 (异或RAX,RAX也有不打破对Silvermont依赖的缺点,但是这个区别不适用于MOVZX。)

即使在 x86-64 之前,也有多种方式可以对实际上相同的指令进行编码(例如 SUB EAX、EAX),寄存器上部的自动归零只是增加了更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2017-03-11
    • 2023-03-27
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多