寄存器概述
寄存器
一. 通用寄存器
寄存器 | 64位 | 32位 | 16位 | 8位 | 编号 | 编号 |
---|---|---|---|---|---|---|
累加寄存器 | RAX | EAX | AX | AL | 000 | 0 |
计数寄存器 | RCX | ECX | CX | CL | 001 | 1 |
数据寄存器 | RDX | EDX | DX | DL | 010 | 2 |
基址寄存器 | RBX | EBX | BX | BL | 011 | 3 |
堆栈顶指针 | RSP | ESP | SP | AH | 100 | 4 |
堆栈基指针 | RBP | EBP | BP | CH | 101 | 5 |
变址寄存器 | RSI | ESI | SI | DH | 110 | 6 |
指令寄存器 | RDI | EDI | DI | BH | 111 | 7 |
1.1 数据寄存器
EAX, ECX, EDX, EBX (Data Register)
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、ECX、EDX和EBX。将这4个32位寄存器的低16位都独立为16位寄存器并命名为AX, CX, DX, BX,这4个16位寄存器的高8位和低8位又分别拆分为2个8位寄存器。
AX | |
---|---|
AH | AL |
通常情况下:
-
AX称为累加寄存器(Accumulator Register):用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,使用频率很高。
-
CX称为计数寄存器(Count Register):在循环和字符串操作时,用来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数。
-
DX称为数据寄存器(Data Register):在进行乘、除运算时,作为默认的操作数参与运算,也可用于存放I/O的端口地址。
-
BX称为基址寄存器(Base Register):作为存储器指针来使用。
1.2 指针寄存器
EBP, ESP (Pointer Register)
32位CPU有2个32位通用寄存器ESP和EBP。其低16位对应先前CPU中的SP和BP,对低16位数据的存取,不影响高16位的数据。
指针寄存器主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式。
为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
- 寄存器SP称为堆栈指针寄存器(Stack Pointer)
- 寄存器BP称为基址指针寄存器(Base Pointer)
1.3 变址寄存器
ESI, EDI (Index Register)
32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
变址寄存器主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
- 寄存器SI称为源变址寄存器 (Source Index)
- 寄存器DI称为目的变址寄存器(Destination Index)
二. 段寄存器
段寄存器是因为对内存的分段管理而设置的。
段寄存器 | 说明 | |
---|---|---|
指令指针寄存器(Instruction Pointer) | IP | 用来存储将要执行的下一条指令的偏移量 |
代码段寄存器(Code Segment) | CS | 一般用于存放代码 通常和IP使用用于处理下一条执行的代码 |
数据段寄存器(Data Segment) | DS | 一般用于存放数据 DS地址对应的数据相当于c语言中的全局变量 |
堆栈段寄存器(Stack Segment) | SS | 一般作为栈使用 和sp搭档 SS地址对应的数据相当于C语言中的局部变量 SS相当于堆栈段的首地址SP相当于堆栈段的偏移地址 |
附加段寄存器(Extra Segment) | ES | 扩展段寄存器 |
FS | 扩展段寄存器 (FS、GS 是从 32位CPU 80386 开始增加的,没有全称) | |
GS | 扩展段寄存器 | |
标志寄存器(Flags) | Flags | 表现微处理器当前状态和某些控制 |