1

我阅读了有关 64 位模式下地址计算的英特尔手册。假设我们有 64 位模式,默认地址大小为 64 位。还假设有问题的指令前面有地址大小覆盖前缀,因此地址大小变为 32 位。

现在,假设该指令使用寄存器编号 0 (rax/eax/ax ...) 指定的地址对内存操作数进行编码。

现在我不完全理解的是,CPU 是否只查看 eax 值并在内部对其进行零扩展以形成“本机”64 位地址,或者它查看整个 rax 值并将其截断为有效的 32 位范围(例如, rax 包含类似 5Gb 的内容,CPU 将其削减到最大 32 位地址)。

4

1 回答 1

2

在 64 位处理器上使用 32 位寻址时,地址计算的结果会被截断为 32 位,然后零扩展为 64 位。请注意,32 位寻址被定义为使用 32 位寄存器,因此如果 RAX 包含 140000000h (5GB),则使用 E​​AX (40000000h) 的值。尽管这在实践中并没有太大的区别。

来自 Intel 64 和 IA-32 架构软件开发人员手册第 1 卷:基本架构:

在 IA-32e 模式下,所有 16 位和 32 位地址计算都进行零扩展以形成 64 位地址。地址计算首先被截断为当前模式(64 位模式或兼容模式)的有效地址大小,并被任何地址大小前缀覆盖。然后将结果零扩展到完整的 64 位地址宽度。因此,在兼容模式下运行的 16 位和 32 位应用程序只能访问 64 位模式有效地址的低 4 GB。同样,在 64 位模式下生成的 32 位地址只能访问 64 位模式有效地址的低 4 GB。

于 2015-05-17T19:38:25.107 回答