assembly - 64 位 x86 中 MOVZX r32、r/m16 和 MOVZX r64、r/m16 的区别

标签 assembly x86 64-bit x86-64

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/

相关文章:

pointers - 有人可以向我解释(用非常简单的术语)esp、ebp 和 esi 寄存器之间的区别是什么?

assembly - 如何转换 Mips 伪指令?

linux - 使用intel_pstate时如何设置特定的CPU频率

c++ - C 和 C++ 中 float 和 double 的大小是多少?

ruby - 无法在 Ubuntu 12.10 (AMD64) 上安装 gem "pg"

c - 段错误 - 调试程序集 gdb

assembly - 使用 mwaitx 时如何解决 ABA 问题?

c - 在 x86 上将 float 转换为 int 的最快方法是什么

c - 使用GNU C内联汇编在VGA内存中绘制字符

64 位 JVM 的 Java 编程