64位模式下的x86-64地址计算

时间:2015-05-17 19:01:12

标签: assembly cpu x86-64

我在64位模式下阅读了有关地址计算的英特尔手册。假设我们有64位模式,默认地址大小为64位。假设有问题的指令前面有地址大小覆盖前缀,因此地址大小变为32位。现在,假设该指令使用寄存器号0(rax / eax / ax ...)指定的地址对内存操作数进行编码。现在我不能完全理解的事情是,CPU是否只看到eax值并且内部零 - 扩展它以形成" native" 64位地址或它查看整个rax值并将其截断为有效的32位范围(例如,rax包含类似5Gb的值,CPU将其切割为最大32位地址)。谢谢你的回复。

1 个答案:

答案 0 :(得分:2)

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

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

  

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