在 X86-64英特尔手册之旅里,我读到
也许最令人惊讶的事实是,像
MOV EAX, EBX
这样的指令会自动将RAX
寄存器的上32位归零。
同一来源引用的 Intel 文档(3.4.1.1通用寄存器在手动基本架构中的64位模式)告诉我们:
- 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汇编的怪异之处)。