寄存器介绍
32位CPU所含有的寄存器有:
- 8个32位通用寄存器,其中包含4个数据寄存器(EAX、EBX、ECX、EDX)、2个变址寄存器(ESI和EDI)和2个指针寄存器(ESP和EBP)
- 6个段寄存器(ES、CS、SS、DS、FS、GS)
- 1个指令指针寄存器(EIP)
- 1个标志寄存器(EFLAGS)
通用寄存器
通用寄存器最常被用来进行算术运算和数据寻址,如下图所示(以eax为例),通用寄存器的低16位都可以被单独使用:
上图还展示了ax寄存器可以被划分为AL和AH使用,这两个都是八位寄存器。支持最低划分为8位的寄存器有EAX、EBX、ECX、EDX:
32位 | 16位 | 高8位 | 低8位 |
EAX | AX | AH | AL |
EBX | BX | BH | BL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
剩下的通用寄存器没有八位模式:
32位 | 16位 |
ESI | SI |
EDI | DI |
EBP | BP |
ESP | SP |
特殊用法
一些通用寄存器有如下的特殊用法:
- EAX被自动用于乘法和除法指令,它通常被称为extended accumulator register
- ECX被CPU自动用作循环计数器
- ESP被用来在栈上寻址数据,它很少被用于其他的用途(例如算术运算等)。它通常被称为extended stack pointer register
- ESI和EDI通常被用作数据传输,它们有时被称为extended source index和extended destination index register
- EBP通常被高级程序语言用来引用栈上的函数参数以及局部变量。它通常被称为extended frame pointer register
段寄存器
2.1 数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX、和EDX。这些寄存器的低16位分别命名为AX、BX、CX和DX,对低16位数的存取,不会影响到高16位的数据。
4个低16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
- 寄存器AX和AL通常被称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,使用频率很高
- 寄存器BX称为基地址寄存器(Base)。它可作为存储器指针来使用
- 寄存器CX被称为计数寄存器(Count)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数
- 寄存器DX称为数据寄存器(Data)。在进行乘法和除法运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
- 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2.2 变址寄存器
32位CPU有2个32位变址寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
2.3 指针寄存器
32位CPU有2个32位指针寄存器EBP和ESP。其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。它们主要用于访问堆栈内的存储单元,存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址访问形式访问存储单元提供方便。
- EBP为基指针(Base Pointer)寄存器,一般作为当前堆栈的最后单元,用它可直接存取堆栈中的数据
- ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
三、标志寄存器
3.1 进位标志(CF,Carry Flag)
进位标志CF主要用来反映运算是否产生进位或错位。如果运算结果的最高位产生了一个进位或错位,那么其值为1,否则其值为0.
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
3.2 奇偶标志(PF,Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0.
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3.3 辅助进位标志(AF,Auxiliary Carry Flag)
在发生下面情况时,辅助进位标志AF的值被置为1,否则其值为0:
- 在字操作时,发生低字节向高字节进位或错位时
- 在字节操作时,发生低4位向高4位进位或错位时
3.4 零标志(ZF,Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
3.5 符号标志(SF,Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
3.6 溢出标志(OF,Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0.
四、指令指针寄存器
32CPU将16位指令指针寄存器(IP)拓展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。这个寄存器存放了下次将要执行的指令在代码段的偏移量。
五、段寄存器
段寄存器是根据内存分段的管理模式来设定的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成,这样可以用两个较小位数的值组合成一个可访问的较大物理空间的内存地址。
CPU内部的段寄存器:
- CS——代码段寄存器(CodeSegmentRegister),其值为代码段的段值;
- DS——数据段寄存器(DataSegmentRegister),其值为数据段的段值;
- ES——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
- SS——堆栈段寄存器(StackSegmentRegister),其值为堆栈段的段值;
- FS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
- GS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值。
在16位CPU系统中,只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
在实模式和保护模式下,段寄存器的作用是不同的:
- 实模式:前4个段寄存器CS、DS、ES、SS与16位CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量
- 保护模式:在此模式下,情况比较复杂,装入段寄存器的不再是段值,而是称为Selector的某个值。