x86汇编语言不得不改变,因为x86处理器架构已从8位变为16位变为32位,现在变为64位。
我知道在32位汇编程序寄存器名称(EAX,EBX等)中,每个名称的E前缀代表扩展意味着32位形式的寄存器而不是16位形式(AX,BX等)。 )。
这些寄存器名称的R前缀在64位中代表什么?
答案 0 :(得分:19)
我认为它只是R表示“寄存器”,因为在x86-64上有额外的寄存器R8-R15,而R是许多CPU架构上的公共前缀,其中寄存器被编号。
答案 1 :(得分:6)
最初的Intel x86处理器,8080处理器,是8位处理器,专为特殊用途,小型计算机(例如收银机)或设备控制器等应用而设计,而不是通用计算机(竞争对手包括摩托罗拉) 6800)。以下8086处理器系列(8086和成本降低8088)是16位微处理器,延续了英特尔8080架构,同时扩展了16位,同时着眼于处理器的更多通用用途。
英特尔8080和英特尔8086处理器的寄存器数量有限,其中大多数具有特殊用途,因此它们的汇编语言具有特定名称,如A,B或AX,BX(摩托罗拉6800等竞争对手类似的约定)。诸如IBM 360/370系列或DEC VAX之类的通用计算机为寄存器等组件(例如R0,R1等)使用了更多通用名称,因为寄存器是通用的(许多高端工作站使用的Motorola 68000 32位处理器)在20世纪80年代与八个数据寄存器D0到D7相似。
自20世纪70年代以来,英特尔不断发展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位寄存器(最低有效16位作为两个8位寄存器访问,如EAX - > AH和AL,EBX - > BH和BL等)当寄存器移位和按位操作用于在32位寄存器的高16位和低16位之间移动16位值时,例如EAX这在某种程度上维持了从8位到16位的变化所做的事情,然而直接访问高位8的方式无法直接访问32位寄存器的高16位。已经提供了8086/8080中16位寄存器的位。
第1卷第3.7.2.1节:英特尔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位寄存器操作有何不同的一些解释。