64位模式下的地址覆盖前缀

时间:2012-05-29 15:51:30

标签: assembly x86-64 intel virtual-address-space amd-processor

在64位模式下,默认地址大小为64位。如果存在地址大小覆盖前缀(67h),则地址大小为32位。

我意识到规范的64位地址通过最重要的实现位(全0或全1)具有位63。 32位地址(通过将67h前缀为64位模式的指令获得)是否需要采用规范形式?如果是,那么这个规范形式是如何定义的?

1 个答案:

答案 0 :(得分:4)

通过对虚拟地址的重要部分(低48位)进行符号扩展来形成规范地址;最重要的部分被视为标志。

现在推测(不愿意查阅 - 但也没有必要回答你的问题) - 在64位模式下,32位地址有两种可能的行为:

  1. CPU将其视为使用32位寄存器/操作数,即零扩展到64位/隐含地将高32位视为零 在这种情况下,任何 32位地址都是规范的,因为任何64位地址0x00000000xxxxxxxx都是规范的。
  2. CPU将其视为“32位有效”,并从32位地址的最高位开始将符号扩展为64位 在这种情况下,任何 32位地址都是规范的,因为32位范围将从0xffffffff80000000 ... 0x000000007fffffff映射 - 再次,所有这些都是规范的。< / LI>

    由于结果(32位地址总是隐式地为规范形式)是相同的,所以CPU实际上做什么并不重要 - 32位地址是规范的,周期。