最初的 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 contents 和Why do most x64 instructions zero the upper part of a 32 bit register 的问答,其中提供了一些关于 64 位寄存器操作与 32 位寄存器操作有何不同的解释。