首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么32位寄存器上的x86-64指令将整个64位寄存器的高位部分置零?

为什么32位寄存器上的x86-64指令将整个64位寄存器的高位部分置零?
EN

Stack Overflow用户
提问于 2012-06-24 19:40:16
回答 4查看 35.6K关注 0票数 153

x86-64 Tour of Intel Manuals中,我读到

也许最令人惊讶的事实是,诸如MOV EAX, EBX这样的指令会自动将RAX寄存器的高32位清零。

在同一来源引用的英特尔文档(手册基本体系结构中64位模式下的3.4.1.1通用寄存器)告诉我们:

在目标通用register.

  • 32-bit操作数中,64位操作数生成64位结果,在目标通用register.

  • 8-bit中,
  • 操作数生成32位结果,而16位操作数则生成8位或16位结果。目的通用寄存器的高56位或48位(分别)不会被该操作修改。如果8位或16位操作的结果用于64位地址计算,请显式对寄存器进行符号扩展,使其达到完整的64位。

在x86-32和x86-64汇编中,16位指令,如

代码语言:javascript
复制
mov ax, bx

不要表现出这种“奇怪”的行为,即eax的上一个单词被归零。

因此:引入这种行为的原因是什么?乍一看,这似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖)。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11177137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档