【问题标题】:x86-64 address calculation in 64bit mode with 32-bit address-sizex86-64 地址计算在 64 位模式下使用 32 位地址大小
【发布时间】:2015-05-17 19:01:11
【问题描述】:

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

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

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

【问题讨论】:

  • 你说的两件事是一样的? 3GB 也适合 32 位。
  • 抱歉,我将 3GB 固定为 5GB。我的意思是,如果rax的高位不为零,会不会影响地址计算?
  • 不,不会。顺便说一句,您可以轻松地对此进行测试。
  • 如果基址(例如 3GB)+ 索引(例如 2GB)大于最大 32 位地址怎么办?计算以 32 位宽度完成,因此结果将是最大有效 32 位地址。对吗?
  • 我不明白这个问题。

标签: assembly x86-64 memory-address addressing-mode


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2020-08-18
    • 2020-03-27
    • 2012-01-22
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多