当前位置: 首页 > 知识库问答 >
问题:

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

陆卓
2023-03-14

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

现在,假设指令用寄存器号0(RAX/EAX/AX...)指定的地址编码内存操作数。

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

共有1个答案

贝杜吟
2023-03-14

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

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

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

 类似资料:
  • 3.8 32位地址的寻址方式 在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。 在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、ED

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。

  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。

  • 2.2.1.3 64位模式下的位移 寻址使用现有的32位MODR/M和SIB编码。MODR/M和SIB大小不变。它们保持8位或32位,并符号扩展到64位。 这表明32bit位移应该是符号扩展的,但我不确定这是否也涉及特殊的moffs寻址模式。在下一页,英特尔说: 2.2.1.6 RIP相对寻址 这表明,在相对寻址模式下,disp32被符号扩展到64位,添加到RIP中,然后截断和零扩展。但是,我不确

  • 问题内容: 我已经使用Java一段时间了,而我典型的设置新开发机的习惯要求从Oracle站点下载并安装最新的JDK。 今天这引发了一个不寻常的问题, 回想起来,我已经安装了之前的两个版本,并且很高兴将普通的工具链插入(Eclipse)。在我的日常编程中,我不会回想起曾经因为使用64位JRE(或为此目的而针对64位JRE)而不得不以其他方式进行更改或思考的事情。 根据我对64位和32位的理解- 确实