X86架构通用寄存器
Little_YangYang

32位通用寄存器

通用寄存器用于存储数据、地址或其他临时值,以便在执行指令时快速访问。32位X86架构的CPU有8个32位的通用寄存器,在汇编中可以直接引用这8个寄存器,分别为

  1. EAX(Accumulator,累加器)

用于算术运算和逻辑运算的结果存储,许多算术指令如乘法和除法指令默认使用EAX寄存器。

  1. ECX(Counter,计数器寄存器)

用于循环计数,在循环和字符串操作中作为计数器,但多数上层语言 不会使用LOOP,一般通过条件跳转系列指令实现。

  1. EDX(Data,数据寄存器)

用于存储扩展数据,在某些乘法和除法操作中与EAX配合使用。

  1. EBX(Base,基址寄存器)

通常用于存储基地址,或在某些情况下存储数据。

  1. ESP(Stack Pointer,堆栈指针)

指向当前栈顶,用于管理函数调用时的堆栈。用于寻找栈上的数据,很少被用于普通算数或数据传输。

  1. EBP(Base Pointer,基址指针/帧指针)

指向函数调用时的栈帧基址,用于访问局部变量和函数参数。一般不用于普通算数或数据传输

  1. ESI(Source Index,源索引寄存器)

用于存储源地址,在数据块传输或字符串处理指令中常被用作源地址指针。

  1. 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位?

  1. 简化硬件设计

x86架构中的高8位寄存器(如AH、BH等)使得硬件设计更为复杂。因为它们与低8位寄存器(如AL、BL等)共享同一个16位寄存器(如AX、BX等),对它们进行部分访问会涉及复杂的操作和位运算。当x86架构扩展到64位时,设计者选择了简化寄存器模型,将寄存器更直观地分割为较大的位宽部分,而不是继续保持复杂的位级访问。

  1. 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位寄存器,而是统一通过更清晰的方式管理寄存器的位宽访问。