在x86-64 Tour of Intel Manuals中,我阅读了
也许最令人惊讶的事实是,诸如
MOV EAX, EBX
自动将寄存器的高 32 位归零之类的指令RAX
。
同一来源引用的英特尔文档(3.4.1.1 General-Purpose Registers in 64-Bit Mode in manual Basic Architecture)告诉我们:
- 64 位操作数在目标通用寄存器中生成 64 位结果。
- 32 位操作数生成 32 位结果,在目标通用寄存器中零扩展为 64 位结果。
- 8 位和 16 位操作数生成 8 位或 16 位结果。目标通用寄存器的高 56 位或 48 位(分别)不会被操作修改。如果 8 位或 16 位操作的结果用于 64 位地址计算,则将寄存器显式符号扩展为完整的 64 位。
在 x86-32 和 x86-64 汇编中,16 位指令如
mov ax, bx
不要表现出这种eax的高位字归零的“奇怪”行为。
因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了 x86-32 汇编的怪癖)。