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.
最佳答案
这两条指令的作用没有区别,只是它们的编码方式不同。这与 XOR EAX、EAX 和 XOR RAX、RAX 做同样的事情没有什么不同,但前者短了一个字节。 (异或RAX,RAX也有不打破对Silvermont依赖的缺点,但这个区别不适用于MOVZX。)
甚至在 x86-64 之前,已经有多种方式对实际上相同的指令进行编码(例如 SUB EAX、EAX),寄存器上部的自动清零只是增加了更多内容。
关于assembly - 64 位 x86 中 MOVZX r32、r/m16 和 MOVZX r64、r/m16 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61390938/