32位通用寄存器
通用寄存器用于存储数据、地址或其他临时值,以便在执行指令时快速访问。32位X86架构的CPU有8个32位的通用寄存器,在汇编中可以直接引用这8个寄存器,分别为
- EAX(Accumulator,累加器)
用于算术运算和逻辑运算的结果存储,许多算术指令如乘法和除法指令默认使用EAX寄存器。
- ECX(Counter,计数器寄存器)
用于循环计数,在循环和字符串操作中作为计数器,但多数上层语言 不会使用LOOP,一般通过条件跳转系列指令实现。
- EDX(Data,数据寄存器)
用于存储扩展数据,在某些乘法和除法操作中与EAX配合使用。
- EBX(Base,基址寄存器)
通常用于存储基地址,或在某些情况下存储数据。
- ESP(Stack Pointer,堆栈指针)
指向当前栈顶,用于管理函数调用时的堆栈。用于寻找栈上的数据,很少被用于普通算数或数据传输。
- EBP(Base Pointer,基址指针/帧指针)
指向函数调用时的栈帧基址,用于访问局部变量和函数参数。一般不用于普通算数或数据传输
- ESI(Source Index,源索引寄存器)
用于存储源地址,在数据块传输或字符串处理指令中常被用作源地址指针。
- EDI(Destination Index,目标索引寄存器)
用于存储目标地址,与ESI配合使用,在数据块传输或字符串处理指令中常用作目标地址指针。
32位寄存器拆分
以EAX为例,EAX的低16位可以单独使用,引用名为AX,而AX又可以进一步拆分为高字节AH与低字节AL,变为8位寄存器
EAX,ECX,EDX,EBX同理,有下表:
32位 | 16位 | 高8位 | 低8位 |
---|---|---|---|
EAX | AX | AH | AL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
EBX | BX | BH | BL |
64位架构
X86_64架构由AMD提出,又被称之为amd64,把通用寄存器的个数拓展到16个,之前的8个通用寄存器被拓展成64位,与32位同理,每个寄存器的低8位、16位、32位都可以单独使用,但没高8位
结构设计如下表图所示
64位 | 32位 | 16位 | 低8位 |
---|---|---|---|
RAX | EAX | AX | AL |
RCX | ECX | CX | CL |
RDX | EDX | DX | DL |
RBX | EBX | BX | BL |
RSP | ESP | SP | SPL |
RBP | EBP | BP | BPL |
RSI | ESI | SI | SIL |
RDI | EDI | DI | DIL |
为什么没有高8位?
- 简化硬件设计
x86架构中的高8位寄存器(如AH、BH等)使得硬件设计更为复杂。因为它们与低8位寄存器(如AL、BL等)共享同一个16位寄存器(如AX、BX等),对它们进行部分访问会涉及复杂的操作和位运算。当x86架构扩展到64位时,设计者选择了简化寄存器模型,将寄存器更直观地分割为较大的位宽部分,而不是继续保持复杂的位级访问。
- 64位扩展的设计原则
x86-64架构引入了新的64位寄存器(如RAX、RBX、RCX等),这些寄存器通过位宽的截取来访问不同大小的数据:
访问最低的32位时,可以使用诸如EAX等32位寄存器。
访问最低的16位时,可以使用诸如AX等16位寄存器。
访问最低的8位时,可以使用诸如AL等8位寄存器。
而对于64位模式下的指令集,64位寄存器被设计成可以简洁地处理低8位的访问需求,没有必要再保留复杂的“高8位”寄存器访问方式。因此,x86-64架构不再需要AH、BH等高8位寄存器,而是统一通过更清晰的方式管理寄存器的位宽访问。