8086/8088寄存器组
在8086/8088系统中,程序员可以使用的寄存器有通用寄存器、段寄存器和标志寄存器。这些寄存器中某些有特定的用途,最常用的是通用寄存器。
2.1.1 8086/8088CPU寄存器组
8086/8088包括四个16位的数据寄存器,两个16位的指针寄存器,两个16位变址寄存器,一个16位的指令指针,四个16位段寄存器,一个16位标志寄存器。这14个16位寄存器分为四组,他们的名称和分组情况如图所示。
图2.1 8086 / 088CPU寄存器分组
1. 通用寄存器
数据寄存器、指针寄存器和变址寄存器统称为通用寄存器。之所以这样称呼,是因为这些寄存器出了各自规定的专门用途外,他们均可以用于传送和暂存数据,还可以保存算术逻辑运算中的操作数和运算结果。
1)数据寄存器
数据寄存器主要用于保存操作数运算结果等信息,他们的存在节省了为存取操作数所需占用总线和访问存储器的时间。
四个16位的数据寄存器AX,BX,CX,DX可分解成八个独立的8位寄存器,这八个8位的寄存器有各自的名称,如图2.1所示,分别称为AH,AL,BH,BL,CH,CL,DH,DL,并且均可以独立存取。名称中的字母H表示高,L表示低。如AH表示高8位,AL表示低8位,AH寄存器和AL寄存器的合并就是AX寄存器。其他寄存器类推。
AX和AL寄存器又成为累加寄存器(Accumulator)。一般通过累加器进行的操作所用的时间可能最少,此外累加器还有许多专门的用途,所以累加器使用的最普遍。
BX寄存器成为基(BASE)地址寄存器。他是四个寄存器中唯一可作为存储器指针使用的寄存器。
CX寄存器称为计数(COUNT)寄存器。在字符串操作和循环操作时,用它来控制重复循环操作次数。在一位操作时,CL寄存器用于保存移位的位数。
DX寄存器称为数据(DATA)寄存器。在进行32位的乘除法操作时,用它存放被除数的高16位或余数。它也用于存放I/O端口地址。
2)变址和指针寄存器
变址和指针寄存器主要用于存放某个存储单元的偏移地址,或某组存储单元开始地址的偏移,即作为存储器(短)指针使用。作为通用寄存器,它们也可以保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是需要的存储单元地址的偏移。注意,16位的变址寄存器和指针寄存器不能分解成8位寄存器使用。利用变址寄存器和指针寄存器不仅能够有效的缩短机器指令的长度,而且能够实现多种存储器操作数的寻址,从而方便地实现对多种类型数据的操作。
SI和DI寄存器称为变址寄存器。在字符串操作中,规定由SI给出源指针,由DI给出目的指针,所以SI也称为源变址(Source Index)寄存器,DI也称为目的变址(Destination Index)寄存器。当然,SI和DI也可作为一般存储器指针使用。
BP和SP寄存器称为指针寄存器。BP主要用于给出堆栈中数据区基址的偏移地址,从而方便的实现直接存取堆栈中的数据,所以BP也称为基指针(Base Pointer)寄存器。正常情况下,SP只作为堆栈指针(Stack Pointer)使用,即保存堆栈栈顶地址的偏移。堆栈是一片存储区域,我们将在后面的章节中详细介绍堆栈操作和堆栈的作用。
表2.1 通用寄存器的专门用途
寄存器 |
用 途 |
AX |
字乘法,字除法,字 I/ O |
AL |
字节乘法,字节除法,字节I/ O,十进制算术运算 |
AH |
字节乘法,字节除法 |
BX |
存储器指针 |
CX |
串操作或循环控制中的计数器 |
CL |
移位计数器 |
DX |
字乘法,字除法,间接I/O |
SI |
存储器指针(串操作中的源指针) |
DI |
存储器指针(串操作中的目的指针) |
BP |
存储器指针(存取堆栈的指针) |
SP |
堆栈指针 |
2. 段寄存器
8086/8088CPU依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。8086/8088把1M字节地址空间分成若干逻辑段,当前使用段的段值存放在段寄存器中。由段值和段内偏移形成20位地址,我们将在下节详细介绍形成20位地址的具体方法。
8086/8088CPU的四个段寄存器均是16位的,分别称为代码段(Code Segment)寄存器CS,数据段(Data Segment)寄存器DS,堆栈段(Stack Segment)寄存器SS,附加段(Extra Segment)寄存器ES。由于8086/8088有这四个寄存器,所以有四个当前使用段可直接存取,这四个当前段分别称为代码段、数据段、堆栈段和附加段。
3. 指令指针
8086/8088CPU中的指令指针IP(Instruction Pointer)也是16位的,它给出接着要执行的指令在代码段中的偏移。(实际上接着要执行的指令已被预取到指令队列,除非发生转移。)
2.1.2 标志寄存器
8086/8088 CPU中有一个16位的标志寄存器,包含了9个标志,主要用于反映处理器的状态和运算结果的某些特征。各标志在标志寄存器中的位置如下所示。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
|
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
有些指令的执行会影响部分标志,而有些指令的执行不会影响标志;反过来,有些指令的执行受某些标志的影响,有些指令的执行不受标志的影响。所以,程序员要充分注意指令与标志的关系。
9个标志可分成两组,第一组6个标志主要受加减运算和逻辑运算结果的影响,称为运算结果标志,第二组标志不受运算结果的影响,称为状态控制标志。
运算结果标志包括以下6位:
OF(Overflow Flag)溢出标志,在运算过程中,如操作数超出了机器能表示的范围,则称为溢出。此时OF位置1,否则置0。
SF(Sign Flag)符号标志,记录运算结果的符号,结果为负时置1,否则置0。
ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0。
CF(Carry Flag)进位标志,记录运算时有效位产生的进位值。例如,执行加法指令时,最高有效位有进位时置1,否则置0。
AF(Auxiliary carry Falg)辅助进位标志,记录运算时第3位(半个字节)产生的进位值。例如,执行加法指令时第3位有进位时置1,否则置0。
PF(Parity Flag)奇偶标志,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。
控制标识位有三个:
DF(Direction Flag)方向标志,在串处理指令中控制处理信息的方向用。当DF位为1时,每次操作后是变址寄存器SI和DI减量,这样就是串处理从高地址向低地址方向处理。当DF为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理。8086/8088提供的专门用于设置方向标志DF的指令是STF,专门用于清除DF的指令时CLD。
IF(Interrupt Flag)中断向量,当IF为1时,允许中断,否则关闭中断。有关中断原理将在后面详细讲解。8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。
TF(Trap Flag)追踪标志,用于单步操作方式,当追踪标志TF被置1后,CPU进入单步方式。所谓单步方式是指在一条指令执行后,产生一个单步中断,这主要用于程序的调试。8086/8088没有专门设置和清除TF标志的指令,用通过其他方法设置或清除TF。
表2.2 PSW中标志位的符号表示(Debug调试中使用)
标志名 |
标志位为1 |
标志位为0 |
OF 溢出(是/否) |
OV |
NV |
DF 方向(减量/增量) |
DN |
UP |
IF 中断(允许/关闭) |
EI |
DI |
SF 符号(负/正) |
NG |
PL |
ZF 零(是/否) |
ZR |
NZ |
AF 辅助进位(是/否) |
AC |
NA |
PF 奇偶(偶/奇) |
PE |
PO |
CF 进位(是/否) |
CY |
NC |