64 位 x86 中 MOVZX r32, r/m16 和 MOVZX r64, r/m16 的区别
Difference between MOVZX r32, r/m16 and MOVZX r64, r/m16 in 64-bit x86
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),寄存器上部的自动清零只是增加了更多。
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),寄存器上部的自动清零只是增加了更多。