2

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

我知道规范 64 位地址的第 63 位到实现的最高有效位全为 0 或全为 1。32 位地址(通过在 64 位模式下的指令前加上 67h 获得)是否需要采用规范形式?如果是,这种规范形式是如何定义的?

4

1 回答 1

4

规范地址是通过对虚拟地址的有效部分(低 48 位)进行符号扩展而形成的;最高有效位被视为符号。

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

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

由于结果(32 位地址总是隐含地采用规范形式)是相同的,因此 CPU 实际执行的操作并不重要 - 32 位地址是规范的,句号。

于 2012-05-29T16:19:19.487 回答