为什么在32位寄存器上的x86-64指令为全64位寄存器的上部为零?在x8664英特尔手册之旅,我读到也许最令人惊讶的事实是,像这样的指令MOV EAX, EBX的上32位自动为零。RAX登记。同一来源引用的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程序集的怪癖)。
2 回答
小唯快跑啊
TA贡献1863条经验 获得超2个赞
RISEBY
TA贡献1856条经验 获得超5个赞
MOV RAX, 42
MOV EAX, 42
- 2 回答
- 0 关注
- 1066 浏览
添加回答
举报
0/150
提交
取消