x86 汇编语言不得不改变,因为 x86 处理器架构从 8 位变为 16 位,再到 32 位,现在是 64 位。
我知道在 32 位汇编器寄存器名称(EAX、EBX 等)中,每个名称的 E 前缀代表扩展,表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等)。
这些寄存器名称的 R 前缀在 64 位中代表什么?
x86 汇编语言不得不改变,因为 x86 处理器架构从 8 位变为 16 位,再到 32 位,现在是 64 位。
我知道在 32 位汇编器寄存器名称(EAX、EBX 等)中,每个名称的 E 前缀代表扩展,表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等)。
这些寄存器名称的 R 前缀在 64 位中代表什么?
我认为它只是“寄存器”的 R,因为在 x86-64 上还有额外的寄存器 R8 - R15,并且 R 是许多寄存器编号的 CPU 架构的常见前缀。
最初的英特尔 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 位,而直接访问 8086/8080 中 16 位寄存器的高 8 位的方式有被提供。
第 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 寄存器 rax/eax/ax/al 覆盖完整寄存器内容的问题和答案以及为什么大多数 x64 指令将 32 位寄存器的上部归零,其中提供了一些关于 64 位寄存器操作与32位寄存器操作。