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 位)数据的视图。在将段寄存器设置为指向存储器块之后,寄存器(例如 BX
,SI
和 DI
)可用作段寄存器的偏移量,因此可以访问 64k 空间中的特定位置。
六段寄存器及其用途是:
寄存器 | 全名 | 描述 |
---|---|---|
SS |
堆栈段 | 指向堆栈 |
CS |
代码段 | 由 CPU 用于获取代码 |
DS |
数据段 | MOV 操作的默认寄存器 |
ES |
额外细分 | 额外数据段 |
FS |
额外细分 | 额外数据段 |
GS |
额外细分 | 额外数据段 |