[具有32位地址大小的64位模式下的x86-64地址计算

问题描述 投票:0回答:1

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

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

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

assembly x86-64 memory-address addressing-mode
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.