【发布时间】: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