x86 寄存器

在 32 位世界中,通用寄存器分为三大类:16 位通用寄存器,32 位扩展通用寄存器和 8 位寄存器半。这三个类根本不代表三个完全不同的寄存器组。16 位和 8 位寄存器实际上是 32 位寄存器的区域名称。通过扩展旧 CPU 中存在的寄存器,可以实现 x86 CPU 系列中的寄存器增长

共有 8 个 16 位通用寄存器:AX,BX,CX,DX,BP,SI,DI 和 SP; 你可以在其中放置任何可以用 16 位或更少的值表示的值。

当英特尔在 1986 年将 x86 架构扩展到 32 位时,它将所有 8 个寄存器的大小增加了一倍,并通过在每个寄存器名称前面添加一个 E 来为它们赋予新名称,从而产生 EAX,EBX,ECX,EDX,EBP,ESI,EDI 和 ESP。

随着 x86_64 的出现,寄存器大小又增加了一倍,并增加了一些新的寄存器。这些寄存器为 64 位宽,并命名(斜杠用于显示备用寄存器名称):RAX / r0,RBX / r3,RCX / r1,RDX / r2,RBP / r5,RSI / r6,RDI / r7,RSP / r4,R8,R9,R10,R11,R12,R13,R14,R15。

虽然通用寄存器可以在技术上用于任何事情,但每个寄存器也有一个替代/主要目的:

  • AX(累加器)用于算术运算。
  • CX(计数器)用于移位和旋转指令,并用于循环。
  • DX(数据)用于算术和 I / O 操作。
  • BX(base) 用作指向数据的指针(特别是在分段模式下作为 DS 段寄存器的偏移量)。
  • SP(堆栈)指向堆栈的顶部。
  • BP(堆栈基础)指向堆栈的基础。
  • SI(源)指向内存中用于流操作的源(例如 lodsb)。
  • DI(目的地)指向内存中用于流操作的目的地(例如 stosb)。

在分段模式中使用的段寄存器指向存储器中的不同段。每个 16 位段寄存器提供 64k(16 位)数据的视图。在将段寄存器设置为指向存储器块之后,寄存器(例如 BXSIDI)可用作段寄存器的偏移量,因此可以访问 64k 空间中的特定位置。

六段寄存器及其用途是:

寄存器 全名 描述
SS 堆栈段 指向堆栈
CS 代码段 由 CPU 用于获取代码
DS 数据段 MOV 操作的默认寄存器
ES 额外细分 额外数据段
FS 额外细分 额外数据段
GS 额外细分 额外数据段