18086寄存器组
在8086的EU和BIU两部分中包含有一些工作寄存器,这些寄存器用来存放计算过程中的各种信息,如操作数地址、操作数及运算的中间结果等。微处理器从寄存器中存取数据比从存储器中存取数据要快的多,因此,在计算过程中,合理利用寄存器保存操作数、中间结果或其它信息,能提高程序的运行效率。根据这些寄存器所起的作用,8086寄存器组可以分为通用寄存器、专用寄存器和段寄存器三类,如图2.3所示。下面分别介绍这些寄存器。
1. 通用寄存器
通用寄存器包括了8个16位的寄存器:AX、BX、CX、DX、SP、BP、DI及SI。其中AX、BX、CX、DX在一般情况下作为通用的数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。它们还可分为两个独立的8位寄存器使用,命名为AL、AH、BL、BH、CL、CH、DL和DH。这4个通用数据寄存器除通用功能外,还有如下专门用途:
AX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。
BX在计算存储器地址时,可作为基址寄存器使用。
CX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器。
DX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址。
SP、BP、SI、DI四个16位寄存器可以象数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,它们可称为指针或变址寄存器。
SP称为堆栈指针寄存器,用来指出栈顶的偏移地址。
BP称为基址指针寄存器,在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址。
SI为源变址寄存器,在串处理指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中的存储单元地址,并有自动增量和自动减量的变址功能。
DI为目的变址寄存器,在串处理指令中,DI和附加段寄存器ES联用,以达到在附加段中寻址的目的,然后DI自动增量或减量。
2. 专用寄存器
8086的专用寄存器包括IP、SP和FLAGS三个16位寄存器。
IP为指令指针寄存器,它用来存放将要执行的下一条指令地址的偏移量,它与段寄存器CS联合形成代码段中指令的物理地址。在计算机中,控制程序的执行流程就是通过控制IP的值来实现的。
SP为堆栈指针寄存器,它与堆栈段寄存器联用来确定堆栈段中栈顶的地址,也就是说SP用来存放栈顶的偏移地址。
FLAGS为标志寄存器,这是一个存放条件码标志、控制标志的16位寄存器。
图2.4说明了8086中标志寄存器的内容,图中未标明的位暂不用
条件码标志用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由CPU自动设置的。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称为条件码。
① 进位标志 CF,记录运算时最高有效位产生的进位值。
② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。
③ 零标志 ZF,运算结果为0时ZF位置1,否则置0。
④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。
⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。
⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。
控制标志位有3位:
① 方向标志 DF,在串处理指令中控制处理信息的方向。当DF=1时,串处理从高地址向低地址方向处理。当DF=0时,串处理就从低地址向高地址方向处理。
② 陷阱标志 TF,用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。
③ 中断标志 IF,用于控制可屏蔽硬件中断。当IF=1时,允许8086微处理器响应中断请求,否则关闭中断。
8086提供了设置某些状态信息的指令。必要时,程序员可使用这些指令来建立状态信息。
在调试程序Debug中提供了测试标志位的手段,它用符号表示某些标志位的值。表2.1说明这些标志位的符号表示。
表2.1 标志位的符号表示
标 志 名
|
标 志 为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 (否)
|
8086微处理器共有4个16位的段寄存器,在寻址内存单元时,用它们直接或间接地存放段地址。
代码段寄存器CS:存放当前执行的程序的段地址。
数据段寄存器DS:存放当前执行的程序所用操作数的段地址。
堆栈段寄存器SS:存放当前执行的程序所用堆栈的段地址。
附加段寄存器ES:存放当前执行程序中一个辅助数据段的段地址。
1.存储单元的地址和内容
计算机存储信息的基本单位是一个二进制位(bit)。一位可存储一个二进制数:0或1,每8位组成一个字节。
微机中常用的数据类型有:
·字节:存储器中存取信息的基本单位。我们常说某存储器容量是64MB,就是说该存储器有64M(1M=220)个字节。其位编号如图2.5(1)所示。
·字:一个字16位,占用两个字节,8086的字长就是16位的。一个字的位编号如图2.5(2)所示。
·双字:一个双字32位,由4个字节组成。其位编号如图2.5(3)所示。
·四字:一个四字64位,由8个字节组成。其位编号如图2.5(4)所示。

对于字、双字、四字数据类型,其低地址中存放低位字节数据,高地址中存放高位字节数据。在读写数据时只需给出最低单元的地址号即可,然后依次存取后续字节。
例如,存储器现存有以下数据(后缀H表示是十六进制数):
地址:
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
内容:
|
0EH
|
0DH
|
0CH
|
0BH
|
0AH
|
89H
|
67H
|
45H
|
23H
|
01H
|
对于不同的数据类型,取地址为2的数据分别是:
(2)字节=45H
(2)字 =6745H
(2)双字=0A896745H
(2)4字=0E0D0C0B0A896745H
可以看出,同一个地址既可看作字节单元的地址,又可看作字单元、双字单元或4字单元的地址,这要根据使用时的情况来确定。而且多字节数据在存储器中是"逆序存放"的。
字单元的地址可以是偶数,也可以是奇数。但是,在8086中,访问存储器(要求取数或存数)都是以字为单位进行的,也就是说,机器是以偶地址访问存储器的。这样,对于奇地址的字单元,要取一个字需要访问二次存储器,这就需要花费较多的时间。
如上所述,如果用X表示某存储单元的地址,则X单元的内容可以表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))来表示Y单元的内容。
2.存储器分段管理
在8086微处理器中,在描述存储器地址时有三个相关的术语:物理地址、偏移地址和逻辑地址。
物理地址是由8086的地址引线送出的20位地址码。这20位地址码送到存储器经过译码,最终选定一个存储单元进行读/写。物理地址可写成5位的十六进制数。
偏移地址是相对于某段首地址的段内偏移量,用16位二进制代码表示,写成4位十六进制数,例如:004AH。
逻辑地址是在程序中对存储器地址的一种表示方法,由某段的段地址和段内偏移地址组成。写成:段地址 : 偏移地址
例如:2000H : 0080H
对存储器寻址起作用的是物理地址,8086对外有20位地址线,因此,存储器的可寻址范围为220=1MB。但是8086微处理器的内部结构是16位的,用户可用的寄存器也都是16位的。显然用16位的地址码无法寻址1MB的存储空间,为了解决这一矛盾,8086采用了分段的方法对存储器进行管理。
存储器地址分段的具体做法是:把1MB的存储器空间分成若干段,每段的容量最大64KB,这样段内地址就可以用16位来表示。实际上,可以根据编程的需要来确定段的大小,它可以是64K字节范围内的任意多个字节。
8086规定:从0地址开始,每16个字节为一小段,段的起始地址必须从任一小段(paragraph)的首地址开始,也就是说,段地址表示成20位的二进制地址码,其最低4位必须是"0"。
存储器采用分段管理后,每个段的首地址(称为段基地址或段地址)保存在8086内部的CS、DS、SS和ES四个16位的寄存器中,我们可以对段寄存器设置不同的值以指向不同的段。
16位的段地址和16位的偏移地址组合形成20位的物理地址,这就是8086的工作方式,这在80x86的寻址模式中称为实模式。
也就是说,把段地址左移4位再加上偏移地址值就形成物理地址。或写成:
段地址 × 16d + 偏移地址 = 物理地址2.5 外部设备
计算机运行时的程序和数据以及所产生的的结果都要通过输入/输出设备与人交互,或者保存在大容量的外存储器中,因此输入/输出设备(或简称外部设备)是计算机必不可少的组成部分,对外设进行有效的管理和信息传输是汇编语言的重要应用领域之一。
从图2.1可见,外部设备与主机(微处理器和存储器)的通信是通过外设接口进行的。每个接口包括一组寄存器。一般说来,这些寄存器有三种不同的用途:
1. 数据寄存器:用来存放要在外设和主机间传送的数据,这种寄存器实际上起缓冲器的作用。
2. 状态寄存器:用来保存外部设备或接口的状态信息,以便微处理器在必要时测试外设状态,了解外设的工作情况。
3. 命令寄存器:CPU给外设或接口的控制命令通过此寄存器送给外部设备。例如,CPU要启动磁盘工作,必须发出启动命令等。
各种外部设备都有以上三种类型的寄存器,只是每个接口所配备的寄存器数量是根据设备的需要确定的。
为了便于主机访问外设,外设中的每个寄存器给予一个端口地址(又称端口号),由这些端口地址组成了一个独立于内存储器的I/O地址空间。80x86的I/O地址空间可达64KB,所以端口地址的范围是0000~FFFFH,用16位二进制代码来表示。端口可以是8位或16位。
在80x86系列机中,由于I/O地址空间是独立编址的,所以系统提供了访问外设的输入/输出指令IN和OUT。
为了便于用户使用外设,8086提供了两种类型的例行程序供用户调用。一种是BIOS(Basic Input/Output System),另一种是DOS(Disk Operating System)功能调用。它们都是系统编制的子程序,通过中断方式转入所需要的子程序去执行。用户通过调用DOS或BIOS例行程序来实现对外设的访问,降低了程序设计的复杂程度,缩短了开发周期。