【问题标题】:What does the R stand for in RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP? [duplicate]RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP 中的 R 代表什么? [复制]
【发布时间】:2012-06-15 06:11:28
【问题描述】:

x86 汇编语言不得不改变,因为 x86 处理器架构从 8 位变为 16 位,再到 32 位,现在是 64 位。

我知道在 32 位汇编器寄存器名称(EAX、EBX 等)中,每个名称的 E 前缀代表扩展,表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等)。 )。

这些寄存器名称的 R 前缀在 64 位中代表什么?

【问题讨论】:

标签: assembly x86 x86-64 cpu-registers cpu-architecture


【解决方案1】:

我认为它只是“寄存器”的 R,因为在 x86-64 上还有额外的寄存器 R8 - R15,并且 R 是许多寄存器编号的 CPU 架构的通用前缀。

【讨论】:

  • 你提到的那些寄存器 (R8 - R15) 是 32 位的吗?
  • 没关系,我刚刚读到它们都是 64 位的,所以我假设 32 位仿真将使用相同的寄存器,其中一半的空格为 0
  • 根据我的阅读,对“R”系列寄存器的 32 位访问会导致高 32 位自动归零。
  • @Brian: 是的,写入任何 32 位寄存器(如 eaxr11dzero-extends into the full 64bit register,避免对完整 reg 的旧值的错误依赖,这是合并语义的问题适用于 16 位和 8 位寄存器。
【解决方案2】:

最初的 Intel x86 处理器,即 8080 处理器,是 8 位处理器,专为特殊用途、小型计算机(例如收银机)或设备控制器等应用而设计,而不是通用计算机(竞争对手包括摩托罗拉6800)。以下 8086 处理器系列(8086 和降低成本的 8088)是 16 位微处理器,它延续了 Intel 8080 架构,同时通过增加 16 位架构对其进行了扩展,着眼于处理器的更通用用途。

英特尔 8080 和英特尔 8086 处理器的寄存器数量有限,其中大部分都有特殊用途,因此它们在汇编语言中具有特定的名称,例如 A、B 或 AX、BX(竞争对手如摩托罗拉 6800类似的约定)。 IBM 360/370 系列或 DEC VAX 等通用计算机对寄存器(例如 R0、R1 等)等组件使用了更通用的名称,因为寄存器是通用的(摩托罗拉 68000 32 位处理器用于许多高端工作站在 1980 年代类似,有 8 个数据寄存器,命名为 D0 到 D7)。

随着英特尔自 1970 年代以来多年来不断发展 x86 处理器,它还试图保持向后兼容性,即使 x86 的目标应用程序已从专用微控制器应用程序扩展到通用计算机。在此演进过程中,寄存器的数量不断增加,许多最初的专用寄存器已向通用用途演进,因为英特尔还在 80286 中引入了处理器芯片操作模式的概念,以帮助实现向后兼容性。

对于 64 位处理器,英特尔需要某种方法来识别 64 位传输与 32 位或其他汇编语言传输。与此同时,英特尔推出了额外的通用寄存器。为通用寄存器使用通用的行业命名约定,字母 R 后跟一个数字是一个简单的决定。

不过,英特尔还面临着必须保持对旧寄存器的向后兼容性。因此,字母 R 用作 16 位寄存器名称的前缀,就像 32 位处理器使用字母 E 作为 16 位寄存器名称的前缀一样。同时,64 位寄存器操作的设计与前几代 32 位寄存器操作的设计略有不同。

随着从 8 位处理器到 16 位处理器的变化,寄存器从 8 位扩展为 16 位,因此名称在寄存器名称后带有字母 X,例如 AX、BX 等。这些寄存器可以被视为两个 8 位寄存器(16 位 AX 寄存器由 8 位 AH 和 8 位 AL 组成,其中 H 表示 AX 寄存器的高位或最高有效位,L 表示 AX 寄存器的低位或最低有效位)。

随着处理器从 16 位更改为 32 位,寄存器从 16 位扩展为 32 位,因此名称以字母 E 作为前缀,例如 EAX、EBX 等。这些寄存器可以被视为具有两个单独的 16 位组件(使用 16 位名称访问的最低有效 16 位,例如 EAX -> AX、EBX -> BX 等)或四个 8 位寄存器(作为两个 8 位寄存器访问的最低有效 16 位,例如 EAX - > AH 和 AL、EBX -> BH 和 BL 等)当寄存器移位和按位运算用于在 32 位寄存器(如 EAX、EBX 等)的高 16 位和低 16 位之间移动 16 位值时. 这在某种程度上维持了从 8 位到 16 位的变化所做的事情,但是直接访问 32 位寄存器的高 16 位不能像直接访问 16 位寄存器的高 8 位那样直接访问已提供 8086/8080 中的位寄存器。

第 1 卷第 3.7.2.1 节:Intel 64 和 IA-32 架构软件开发人员手册的基本架构,其中提到了 64 位模式。

Register operands in 64-bit mode can be any of the following:
• 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15)
• 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D)
• 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W)
• 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8L-R15L are available using REX
prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes.
• Segment registers (CS, DS, SS, ES, FS, and GS)
• RFLAGS register
• x87 FPU registers (ST0 through ST7, status word, control word, tag word, data operand pointer, and instruction
pointer)
• MMX registers (MM0 through MM7)
• XMM registers (XMM0 through XMM15) and the MXCSR register
• Control registers (CR0, CR2, CR3, CR4, and CR8) and system table pointer registers (GDTR, LDTR, IDTR, and
task register)
• Debug registers (DR0, DR1, DR2, DR3, DR6, and DR7)
• MSR registers
• RDX:RAX register pair representing a 128-bit operand

请参阅x86_64 registers rax/eax/ax/al overwriting full register contentsWhy do most x64 instructions zero the upper part of a 32 bit register 的问答,其中提供了一些关于 64 位寄存器操作与 32 位寄存器操作有何不同的解释。

【讨论】:

  • AMD 设计了 ​​AMD64,而英特尔则致力于 IA-64(安腾)。直到 x86-64 流行起来(部分归功于 AMD 的第一个 AMD64 微架构 K8 的高性能),英特尔才将其添加到 P4 和 P6(在 Core2 中),称之为“IA-32e”。跨度>
  • @PeterCordes,感谢您的澄清。阅读英特尔软件开发人员手册中的简要历史,提到 64 位首次出现在英特尔的其中一个处理器的高端版本中,并在下一次迭代中可用。我不确定 IA-64 Itanium 与 P4 和 P6 之间有什么区别。 Itanium 似乎主要是一种企业服务器级处理器。
  • IA-64 是一个完全独立的架构,根本不是 x86。 P4 是 Pentium 4,the "netburst" microarchitecture,它针对高时钟速度而不是高性能进行了优化,因为当时 CPU 仍然以时钟速度销售。 P6 is the microarchitecture family started with Pentium Pro/ Pentium II,并在 Nehalem 达到高潮。 (Sandybridge is a new microarchitecture family.)
  • @PeterCordes,感谢您提供这些链接。我有一些阅读要做,尤其是关于 Sandybridge。
  • x86 tag wiki 中有很多很好的链接,尤其是 Agner Fog's microarch pdf,它有足够的信息来预测一个循环将在它所覆盖的每个微架构上运行多少个循环。
猜你喜欢
  • 2014-01-15
  • 2016-06-25
  • 2022-09-27
  • 2020-02-16
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多