64位x86中MOVZX r32、rm16与MOVZX r64、rm16的区别。

问题描述 投票:1回答:1

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.
assembly x86 64-bit x86-64
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.