Intel 8086是一个16位的微处理器,有20条地址线,能访问1MB实际地址的存储空间。
8086微处理器内部结构如图3-2所示。从图3-2中可看出,8086微处理器由两个部分即指令执行部件(EU)和总线接口部件(BIU)组成。指令执行部件由算术逻辑运算单元(ALU)、标志寄存器(FLAGS)、通用寄存器组和EU控制器4个部件组成,其主要功能是执行指令。总线接口部件由地址加法器、专用寄存器组、指令队列和总线控制逻辑4个部件组成。它的主要功能是形成访问存储器的物理地址;访问存储器取得指令并暂存到指令队列中等待执行;访问存储器或I/O端口以读取操作数参与EU运算,或存放运算结果等。
图3-2 8086微处理器的内部结构
总线接口部件(BIU)主要由地址加法器、专用寄存器组、指令队列缓冲器和总线控制电路4个部件组成,其主要功能是负责完成CPU与存储器或I/O设备之间的数据传送。BIU中地址加法器把来自于段寄存器的16位地址(段首地址)左移4位后与16位偏移地址(来自于IP寄存器或EU的16位寄存器或其他位置)相加,形成20位的实际地址,以对1MB的存储空间进行寻址。具体地说,当CPU取指令时,BIU将CS中16位段首地址左移4位并和IP中16位偏移地址相加,形成指令在存储器中的物理地址,然后访问该物理地址所对应的存储单元,从中取出指令代码送到指令队列缓冲器中等待执行。指令队列一共6个字节(8088的指令队列为4个字节),一旦指令队列中空出2个(8086)或1个(8088)字节,BIU将自动进入读指令操作以填满指令队列;遇到转移类指令时,BIU将指令队列中的内存指令作废,重新从新的目标地址中取指令送到指令缓冲队列中。当EU需要读/写数据时,BIU将相应段寄存器中16位段首地址左移4位和EU送来的16位偏移地址相加,形成操作数的物理地址,从该地址单元中读取操作数或者将指令的执行结果传送到该单元中。
总线控制电路将8086/8088微处理器的内部总线与它引脚所连接的外部总线相连,它是8086/8088与外部交换信息的必经之路,包括16条数据线、20条地址线和若干条控制信号线。微处理器正是通过这些总线与外部取得联系从而形成各种规模的8086/8088微型计算机。
从微处理器的内部结构来看,8088与8086很相似,区别仅表现在以下两个方面。
(1)8088与外部交换数据的数据总线宽度是8位,总线控制电路与专用寄存器组之间的数据总线宽度也是8位,而EU内部总线仍是16位,所以把8088称为准16位微处理器。
(2)8088 BIU中指令队列的长度只有48字节,只要队列中出现一个空闲字节,BIU就会自动访问存储器,取指令来填满指令队列。
EU的功能是执行指令。一般情况下,指令按照它存放的先后次序顺序执行。EU从指令队列中源源不断地取得指令代码,满负荷地连续执行指令而省去了取指令的时间。指令执行过程中如果需要访问存储器取操作数,那么EU将访问地址送给BIU,等待操作数到达,然后继续操作。遇到转移类指令,BIU会将指令队列中的后继指令作废,从新的地址重新取指令。这时,EU要等待BIU将取到的指令装入指令队列后才能继续执行。在这两种情况下,EU和BIU的并行操作会受到一定影响,但是只要转移指令出现的比例不是很高,两者的重叠操作仍然会取得良好的效果。
EU中的算术逻辑运算单元(ALU)可完成16位或8位的二进制运算,运算结果通过内部总线送到通用寄存器,或者送往BIU的内部寄存器中,等待写入存储器。16位暂存器用来暂存参加运算的操作数。ALU运算后的结果特征(有无进位、溢出等)置入标志寄存器(FLAGS)中保存。
EU控制器负责从BIU的指令队列中取出指令,并对指令译码,根据指令要求向EU内部各部件发出控制命令以实现这条指令的功能。
8086/8088 CPU的内部寄存器如表3-1所示。
表3-1 8086/8088 CPU内部寄存器
寄存器 |
高字节 |
低字节 |
说 明 |
分 类 |
AX BX CX DX |
AH BH CH DH |
AL BL CL DL |
累加器 基址寄存器 计数寄存器 数据寄存器 |
通用数据寄存器 |
SP BP SI DI |
|
|
堆栈指针 基址指针 源变址 目的变址 |
指针和变址寄存器 |
CS DS SS ES |
|
|
代码段 数据段 堆栈段 附加段 |
段寄存器 |
IP FLAGS |
|
|
指令指针 标志寄存器 |
控制寄存器 |
8086/8088微处理器指令执行部件(EU)中有8个16位通用寄存器,它们可分成两组。一组由AX、BX、CX和DX构成,称做通用数据寄存器,用来存放16位的数据或地址。也可以把它们当作8个8位寄存器来使用,也就是把每个通用寄存器的高半部分和低半部分分开。低半部分被命名为AL、BL、CL和DL;高半部分被命名为AH、BH、CH和DH。8位寄存器只能存放数据而不能存放地址。
(1)AX称为累加器,是算术运算时使用最多的寄存器,而且所有外部设备的输入/输出指令只能使用AL或AX作为数据寄存器。
(2)BX称为基址寄存器,它可以用作数据寄存器,在访问存储器时也可以存放被读/写的存储单元的地址,是具有双重功能的寄存器。
(3)CX称为计数寄存器,它可以用作数据寄存器,在字符串操作、循环操作和移位操作时用作计数器。
(4)DX称为数据寄存器,它在乘、除法中作为辅助累加器,在输入/输出操作中存放端口的地址。
另一组4个16位寄存器主要用来存放操作数的偏移地址(即操作数的段内地址)。
(1)SP称为堆栈指针寄存器,存放栈顶的偏移地址,供堆栈操作使用。
(2)BP称为基址指针寄存器,常常用来存放堆栈内数据的基地址。
(3)SI称为源变址寄存器,主要用于存放地址,在字符串操作中存放源操作数的偏移地址。变址寄存器内存放的地址在数据传送完成后,具有自动修改的功能。例如,传送1个字节数据后把地址加1,为下次传送做好准备,变址寄存器因此得名。
(4)DI称为目的变址寄存器,主要用于存放地址,在字符串操作中存放目的操作数的偏移地址。
8086/8088微处理器总线接口部件(BIU)中设置有4个16位段寄存器,它们是代码段寄存器(CS)、数据段寄存器(DS)、附加段寄存器(ES)和堆栈段寄存器(SS)。
代码段存放程序指令,程序代码超过64KB时需要分成几个段存放。CS中存放的是现在正在执行的程序段的段基址。
数据段用于存放当前使用的数据,需要第二个数据段时可以使用附加段。
堆栈段是内存中的一块存储区,用来存放专用数据。例如,调用子程序时的入口参数、返回地址等,这些数据都按照先进后出的规则进行存取。SS存放堆栈段的段基址,SP存放当前堆栈栈顶的偏移地址。数据进出堆栈要使用专门的堆栈操作指令,SP的值在执行堆栈操作指令时根据规则自动地进行修改。
编程时,程序和各种不同类型的数据分别存放在不同的逻辑段中,它们的段基址存放在段寄存器中,偏移地址存放在指针寄存器或变址寄存器中。
8086/8088微处理器中设置了一个16位标志寄存器(FLAGS),用来存放运算结果的特征和控制标志,其格式如图3-3所示。
15 |
11 |
10 |
9 |
8 |
7 |
6 |
|
4 |
|
2 |
|
0 |
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
PF |
|
CF |
图3-3 8086/8088微处理器16位标志寄存器格式
标志寄存器FLAGS中存放的9个标志位可分成两类,一类叫状态标志,用来表示运算结果的特征,包括CF、PF、AF、ZF、SF和OF;另一类叫控制标志,用来控制微处理器的操作,包括IF、DF和TF。各标志位的作用说明如下:
(1)CF(Carry Flag):进位标志位。CF=1表示本次运算中最高位(第7位或第15位)有进位(加法运算时)或有借位(减法运算时)。
进行两个无符号数加法或减法运算后,如果CF=1,表示运算的结果超出了该字长能够表示的数据范围。例如,执行8位数据运算后,CF=1表示加法结果超过了255,或者是减法得到的差小于0。
进行有符号数运算时,CF对运算结果没有直接意义。
(2)PF(Parity Flag):奇偶标志位。PF=1表示本次运算结果的低8位中有偶数个1;PF=0表示有奇数个1。PF可以用来进行奇偶校验,或者用来生成奇偶校验位。
(3)AF(Auxiliary Carry Flag):辅助进位标志位。AF=1表示8位运算结果(限使用AL寄存器)中低4位向高4位有进位(加法运算时)或有借位(减法运算时),这个标志位只在BCD数运算中起作用。
(4)ZF(Zero Flag):零标志位。ZF=1表示运算结果为0(各位全为0);否则ZF=0。
(5)SF(Sign Flag):符号标志位。SF=1表示运算结果的最高位(第7位或第15位)为1;否则SF=0。
(6)OF(Overflow Flag):溢出标志位。OF=1表示两个用补码表示的有符号数的加法或减法结果超出了该字长所能表示的范围。例如,进行8位运算时,OF=1表示运算结果大于+127或小于-128,此时不能得到正确的运算结果。OF标志对无符号数的运算结果没有意义。
(7)IF(Interrupt Flag):中断允许标志位。IF=1表示允许微处理器响应可屏蔽中断。IF标志可通过STI指令置位(置1),也可通过CLI指令复位(清0)。
(8)DF(Direction Flag):方向标志位。在串操作指令中,若DF=0,表示串操作指令执行后地址指针自动增量,串操作由低地址向高地址进行;若DF=1,表示地址指针自动减量,串操作由高地址向低地址进行。DF标志位可通过STD指令置位,也可通过CLD指令复位。
(9)TF(Tap Flag):单步标志位。TF=1表示控制微处理器进入单步工作方式。在这种工作方式下,微处理器每执行完一条指令就会自动产生一次内部中断,这在程序调试过程中很有用。
8086/8088微处理器中有一个16位指令指针寄存器(IP),用来存放将要执行的下一条指令在代码段中的偏移地址。在程序运行过程中,BIU自动修改IP中的内容,使它始终指向将要执行的下一条指令。
程序不能直接访问IP,但是可通过某些指令修改IP的内容。例如,执行转移指令时会将转移的目标地址送入IP中,以实现程序的转移。