MOVZX r32,rm16和MOVZX r64,rm16都有操作码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做同样的事情没有什么不同,但前者短了一个字节。 (XOR RAX,RAX还有一个缺点,就是不破坏对Silvermont的依赖性,但这个区别不适用于MOVZX)。
即使在x86-64之前,也有各种编码方式,实际上是相同的指令(例如SUB EAX,EAX),寄存器上部的自动归零只是增加了更多的内容。