在 64 位模式下,默认地址大小为 64 位。如果存在地址大小覆盖前缀 (67h),则地址大小为 32 位。
我知道规范 64 位地址的第 63 位到实现的最高有效位全为 0 或全为 1。32 位地址(通过在 64 位模式下的指令前加上 67h 获得)是否需要采用规范形式?如果是,这种规范形式是如何定义的?
在 64 位模式下,默认地址大小为 64 位。如果存在地址大小覆盖前缀 (67h),则地址大小为 32 位。
我知道规范 64 位地址的第 63 位到实现的最高有效位全为 0 或全为 1。32 位地址(通过在 64 位模式下的指令前加上 67h 获得)是否需要采用规范形式?如果是,这种规范形式是如何定义的?
规范地址是通过对虚拟地址的有效部分(低 48 位)进行符号扩展而形成的;最高有效位被视为符号。
现在对此进行推测(不愿意查找 - 但这也没有必要回答你的问题) - 在 64 位模式下,32 位地址有两种可能的行为:
0x00000000xxxxxxxx
都是规范的。0xffffffff80000000
... 0x000000007fffffff
- 再次,所有这些都是规范的。由于结果(32 位地址总是隐含地采用规范形式)是相同的,因此 CPU 实际执行的操作并不重要 - 32 位地址是规范的,句号。