《微机原理与接口技术》第 3 章 80x86微处理器
80 x86微处理器
目录
3.1 Intel 8086微处理器
Intel 8086微处理器:是由美国Intel公司1978年推出的高性能的16位微处理器,是第三代微处理器的典型代表。
20根地址总线:可编码2^20个字节的空间,直接寻址能力达1MB;
16根数据总线:外部系统总线的数据总线、内部总线、ALU均为16位,可进行8位和16位操作。
小芝士——8086的起源
Intel 8086芯片的起源可以从8085说起,这个名字的字面意思是:80年代(实际上是70年代后半期)生产的8位5伏电压处理器。后来,对这个进行升级,就简单的在个位上加1,变成了8086,也就出现了那个非常著名的x86鼻祖,于是就延用下来了。其实,后来的32位和64位系统,全名叫做x86-32 和 x86-64。但是,为了方便区分,就变成了x86和x64。
总结一下
8085是8位,8086是16位,x86-32是32位,x86-64是64位。其中,x86就是x86-32的简称,x64就是x86-64的简称。
3.2 8086的存储器组织
3.2.1 寻址空间和数据存储格式
(1)寻址空间
程序和数据存放在内存中,CPU根据地址访问内存,找到需要的指令或数据。
寻址空间:指存储器地址允许的最大范围,即CPU能访问多大范围的地址。
计算机的寻址空间是由CPU地址总线的位数决定的。
当存储器按字节编址时,若地址总线为n位,CPU寻址范围是2^n字节。
例如,8086 CPU有地址总线20位,寻址能力为2^20=1MB;80286的地址总线为24位,CPU的寻址能力为2^24=16MB;80386地址总线为32位,CPU的寻址能力为2^32=4GB。
寻址范围的大小和内存的实际容量并不一定相等,但是如果地址总线位数不够,即使有很大的内存也无法完全访问。而对于当前主流的微处理器,其寻址能力已远远超过实际的内存容量。
(2)8086存储器的组织及寻址
8086地址总线20位,寻址能力为1MB,每个字节用唯一的一个地址码标识。
地址的范围为0~2^20-1,用十进制表示为0~1048575。
但习惯上使用十六进制表示,即00000H~FFFFFH。
按字节编址:这种每个字节对应一个地址的方式称为“按字节编址”。
如图3.1所示。

8086系统的存储空间虽然按照字节编址,但在实际编程时,一个变量可以是字节、字或双字类型。
Ⅰ字节数据(BYTE):字节数据为8位,对应的地址可以是偶地址(地址的最低位A0=0),也可以是奇地址(A0=1)。
当CPU存取字节数据时,只需给出对应的实际地址即可。
Ⅱ字数据(WORD):Intel 8086是16位机,字长16位,每个字数据存放在两个连续的字节单元中。其中高8位存放在高地址字节(称为高字节),低8位存放在低地址字节(称为低字节)——小端存储
规定将字数据低字节的地址作为这个字的地址(字地址),如图3.2所示。
规则字:字地址(低字节地址)位于偶地址,A0=0。
非规则字:字地址(低字节地址)位于奇地址,A0=1。

小端字节序 & 大端字节序——多字节数据在内存中的存储顺序
小端字节序:数据的起始字节D0~D7存储在内存空间的小端——低地址端。
大端字节序:数据的起始字节D0~D7存储在内存空间的大端——高地址端。
Ⅲ双字数据:双字数据占用4个连续字节单元。
规定将双字数据的最低字节地址为双字的地址,如图3.3所示

注:以上的“字数据”、“双字数据”都是相对于8086而言——16位微处理器,一个字是两个字节。
8086系统将1MB的内存分为两个块,每个块的容量都是512KB,如图3.4所示。

高位字节块(奇地址块):和数据总线的高8位D15~D8相连的块称为高位字节块,它由所有的奇地址单元编码,对应双字数据的D15~D8、D31~D24位,也称为奇地址块;
低位字节块(偶地址块):和数据总线的低8位D7~D0相连的块称为低位字节块,它由所有的偶地址单元编码,对应双字数据的D7~D0、D23~D16位,也称为偶地址块。
① 存储器的高位字节块由~BHE(CPU的控制引脚之一,低电平有效)信号作为片选输入信号;
② 存储器的低位字节块由地址线A0=0(低电平)(CPU的地址引脚之一)作为该块的片选输入信号。
对于每个块内的512字节,通过A19~A1,共19位地址线进行寻址——19位地址线寻址512B空间。
当CPU访问内存时,首先根据~BHE和A0信号配合判断字节所在的块——都是低电平有效,因为片选输入端~CS。
然后通过A19~A1,访问相应块中的存储单元,表3.1所示为~BHE和A0组合可能进行的操作:

(1)当~BHE=0、A0=0时,高位字节块和低位字节块同时有效,8086 CPU通过A19~A1同时在两个块中各寻址一字节,高位字节块中的数据经数据线的高8位(D15~D8)传送,低位字节块中的数据经数据线的低8位(D7~D0)传送,完成一个规则字的存取操作。——两字节块同时寻址,低8位先经低8位传送,地址自增,高8位经高8位传送。是低字节块需要20根地址线寻址,高字节块只需要19根地址线寻址,所以可以同时寻址。——通过将偶地址和奇地址的数据分别连接到不同的数据线,8086可以在一个总线周期内读取或写入一个规则字。
(2.1)当~BHE=0、A0=1时,高位字节块有效,通过A19~A1,在该块中寻址一字节,并经数据线的高8位(D15~D8)传送。——高字节块寻址
(2.2)当~BHE=1、A0=0时,低位字节块有效,通过A19~A1,在该块中寻址一字节,并经数据线的低8位(D7~D0)传送。——低字节块寻址
(3)而对于非规则字的存取操作,则需要两个总线周期才能完成:在第一个总线周期中~BHE=0、A0=1,通过奇地址块存取低8位到高8位数据线;在第二个总线周期中,~BHE=1、A0=0,存储器地址加1,通过偶地址块存取高8位到低8位数据线。——非规则字的偶地址是高地址放高位数据。
这里存取操作所需的~BHE及A0信号是由字操作指令给出的。

3.2.2 存储器的分段结构和物理地址的形成
(1)存储器的分段结构
8086CPU的20位地址线,可直接寻址1MB存储器物理空间。
其地址范围为00000H~FFFFFH。
物理地址:与存储单元一一对应的20位地址,称为存储单元的物理地址。
但8086 CPU内部寄存器均为16位(但是有20位的加法器),8086指令中的地址码也只有16位,那么,利用16位的寄存器如何表示20位地址呢?
逻辑段:为了解决这个问题,8086存储器采用分段管理,将1MB的存储空间分成若干个逻辑段。
规定每个逻辑段长度≤64KB(16位寄存器的表示极限,即至少16段)。

规定段起始地址的低4位必须为0——即整除16,目的是为了保证段基地址左移4位(×16)就能得到段首物理地址。
段基地址(段地址):将段起始地址的高16位称为该段的段地址(段基地址)。
偏移地址:段内存储单元相对于段起始地址偏移量称为当前段内的偏移地址。
由于一个段最大可以包含64KB,因此偏移地址是16位的。
这样,任何一个内存单元的地址都可以用“段地址+偏移地址”来表示,其格式为:
段地址:偏移地址
逻辑地址:这种地址表示的方式称为逻辑地址。
//例
CS:IP
SS:SP
CS、IP、SS、BP:16位
可见,通过对内存的分段,将20位的物理地址,用1个16位的段地址和1个16位的偏移地址组成的理辑地址表示,解决了16位CPU寻址1MB存储空间的问题。
另外,内存分段也为程序的浮动分配创造了条件。
(2)物理地址的形成
根据逻辑地址,可以求出它对应的物理地址:
物理地址=段地址×10H + 偏移地址
//物理地址=段地址×16 + 偏移地址
//物理地址=段地址左移4位 + 偏移地址
8086 CPU由一个专门的20位地址加法器实现逻辑地址到物理地址的变换。
当CPU寻址某个存储单元时,首先将段地址左移4位(×16),再与16位偏移地址相加,从而形成20位的物理地址,如图3.5所示。


(3)按信息特征分段存储
在存储器中存储的信息可分为程序指令、数据和计算机系统的状态等信息。为了寻址及操作的方便,8086系统中,存储器空间根据信息特征分段存储。
一般可将存储器划分为程序段、数据段、堆栈段、附加段。
程序段(Code Segment,CS):存储程序的指令代码;
数据段(Data Segment,DS):存储数据、中间结果和最后结果;
附加段(Extra Segment,ES):存储数据、中间结果和最后结果;
堆栈段(Stack Segment,SS):存储压入堆栈的数据或状态信息。
取指令时,CPU自动选择代码段寄存器(CS);
堆栈操作时,CPU自动选择堆栈段寄存器(SS);
存取操作数时,CPU会自动选择数据段寄存器(DS) or 附加段寄存器(ES)。
3.3 8086微处理器的内部结构
3.3.1 8086 CPU的内部结构
CPU的任务:执行存放在存储器中的指令序列——取指令、执行指令(存数据、取数据、数据运算)。
8086 CPU内部由两大功能部件组成:
总线接口部件(Bus Interface Unit,BIU)、执行部件(Execute Unit,EU)。
控制器、运算器。
其结构框图如图3.6所示。

在执行指令的过程中,BIU和EU是既分工又合作的两个独立部件。
BIU部件:负责存取指令和数据。
EU部件:负责执行指令。
它们的操作是并行的,如图3.7所示。

BIU和EU是各自独立工作的,在EU执行指令的同时,BIU可预取下面一条或几条指令。也就是说,一条指令在EU中执行的同时,BIU就可以提前取出下一条(或多条)指令放在指令队列中排队。当CPU执行完当前指令后,就可立即执行存放在指令队列中的下一条指令,而无须先取指令。
EU和BIU的并行操作提高了CPU和总线的利用率,加快了程序的运行速度。
BIU和EU的操作遵循下列原则。
① 每当8086 CPU指令队列中有两个空字节(2 Byte,16位)时,BIU就会自动寻找空闲的总线周期进行预取指令操作,直到指令队列填满为止。
② 当指令队列缓冲器中存有一条以上的指令时,EU就立即开始执行。
③ 每当EU执行一条转移、调用或返回指令后,BIU清空指令队列,并从转移后的当前地址取出指令送EU执行,实现程序段的转移;然后在新地址基础上再做预取指令操作。
(1)总线接口部件-BIU
总线接口部件-BIU:完成 CPU 与 主存储器 or I/O端口 间的信息传送。
它的主要功能如下:
① 预取指令序列。BIU会自动进行预取指令操作,并将从存储器中取出的指令按先后次序存入指令缓冲寄存器,以便EU按顺序执行这些指令。
② 存取数据。在指令执行期间,BIU配合EU,从指定的内存单元或I/O端口中取出数据传送给执行单元,或者把执行单元的处理结果传送到指定的内存单元或I/O端口中。
③ 将访问主存的逻辑地址转换为实际的物理地址。
8086-BIU的组成:20位地址加法器、4个16位段寄存器、一个16位指令指针IP、一个6字节的指令队列缓冲器,以及总线控制逻辑电路等组成。
① 地址加法器:将16位的段寄存器内容左移4位,与16位偏移地址相加,形成20位的物理地址。
② 指令指针IP:16位指令指针IP用来存放下一条将要执行的指令在代码段中的偏移地址。
③ 指令队列缓冲器:指令队列寄存器用来缓存BIU取出待执行的指令。该队列寄存器按“先进先出”的方式工作。
④ 总线控制逻辑电路:总线控制逻辑将8086 CPU的内部总线 和 系统总线 相连,是8086 CPU与内存单元或I/O端口进行数据交换的必经之路。它包括16条数据总线、20条地址总线、若干条控制总线,CPU通过这些总线与外部取得联系,从而构成各种规模的8086微型计算机系统。
(2)执行部件-EU
执行部件(EU):负责进行所有指令的解释和执行,同时管理EU中相关的寄存器。
它的主要功能如下。
① 从指令队列中取出指令代码,由EU控制器进行译码,然后控制各部件完成指令规定的操作。
② 对操作数进行算术和逻辑运算,并将运算结果的特征状态存放在标志寄存器中
③ 当需要与主存储器或I/O端口传送数据时,EU向BIU发出命令,并提供要访问的内存地址或I/O端口地址及传送的数据。
8086-EU的组成:16位的算术逻辑运算单元(ALU)、8个16位通用寄存器、一个16位标志寄存器FLAGS、一个数据暂存寄存器、EU控制电路组成。
① 算术逻辑运算单元(ALU):算术逻辑运算单元是一个16位的运算器,可用于8位、16位二进制算术和逻辑运算,也可计算内存地址的16位偏移量。
② 通用寄存器组:通用寄存器组包括4个16位的数据寄存器AX、BX、CX、DX和4个16位指针与变址寄存器SP、BP与SI、DI。
③ 标志寄存器:标志寄存器是一个16位的寄存器,用来反映CPU运算的状态特征和存放某此控制标志。
④ 数据暂存寄存器:数据暂存寄存器协助ALU完成运算,暂存参加运算的数据。
⑤ EU控制电路:EU控制电路负责从BIU的指令队列缓冲器中取指令,并对指令译码,根据指令的要求向EU内部各部件发出控制命令,以完成各条指令规定的功能。
执行单元(EU)中的各部件通过16位的内部总线连接在一起,在内部实现快速数据传输。
值得注意的是,这个内部总线与CPU外接的总线之间是隔离的,即这两个总线可以同时工作而互不干扰。
EU从BIU的指令队列缓冲器中取出指令并执行,由BIU通过外部总线从存储器中取得指令。
在指令执行过程中可能需要从存储器中存取数据,这时,EU单元将16位有效地址提供给BIU,在BIU中转换为20位的物理地址,送到外部总线进行寻址。
3.3.2 8086 CPU 的寄存器结构
8086微处理器内部共有14个4类16位寄存器(8 + 1 + 1 + 4)。
8:通用寄存器 == 4 (数据寄存器)+ 4(指针与变址寄存器)
1:标志寄存器
1:指令指针寄存器
4:段寄存器
这14个寄存器按其用途可分为数据寄存器、地址指针、变址寄存器、段寄存器、控制寄存器。
8086CPU内部寄存器如图3.8所示。

(1)段寄存器
在8086系统中,存储器是分段管理的,访问存储器的地址码由段地址和段内偏移地址两部分组成。
段寄存器:用来存放段地址,包括4个16位寄存器——代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES。
代码段寄存器CS:存放当前正在运行的程序所在段的段地址,段内的偏移地址则由 IP 提供。
CS:IP
数据段寄存器DS:存放当前程序使用的数据所在段的段地址,段内的偏移地址则由 BX、SI、DI 提供。
DS:BX
DS:SI
DS:DI
附加段寄存器ES:存放当前程序使用附加段的段地址,段内的偏移地址则由 BX、SI、DI 提供。
附加段是一个附加的数据段,在执行串操作指令时,作为目的串地址使用。
ES:BX
ES:SI
ES:DI
堆栈段寄存器SS:存放当前堆栈段的段地址,段内的偏移地址则由 BP 提供,栈顶的偏移地址则由 SP 提供。
堆栈是在存储器中开辟的、按照“后进先出”原则组织的一个特殊区域。
主要用于子程序调用时保护现场(恢复现场)和保存断点(恢复断点)。
(2)数据寄存器
数据寄存器:用来暂时存放计算过程中所用到的操作数、结果或其他信息。
4个通用16位数据寄存器包括AX、BX、CX、DX。
值得注意的是,它们都可以以 字(16位) 或 字节(8位) 的形式访问。
例:AX寄存器,可以单独访问高字节AH、低字节AL寄存器。
因此:
① 可以看作4个16位通用数据寄存器 AX、BX、CX、DX;
② 也可作为8个8位通用数据寄存器AH、AL、BH、BL、CH、CL、DH、DL。
AX、BX、CX、DX还可以用于各自的专用目的:
① 累加器 AX(Accumulator)
主要作为累加器使用,它是算术运算指令的主要寄存器。
另外,所有的I/O指令都使用这一寄存器与外部设备传送信息。
② 基址寄存器 BX(Base)
在存储器寻址时(数据寻址、指令寻址),它经常用作基址寄存器。
DS:BX
ES:BX
SS:SP
CS:IP
③ 计数寄存器 CX(Count)
在循环指令、串操作指令中,用作隐含的次数寄存器。
④ 数据寄存器 DX(Data)
一般在做双字长算术运算指令时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。
此外,对于某些I/O操作指令,DX可用来存放I/O的端口地址。
(3)地址指针与变址寄存器
它们一般用来存放主存地址的段内偏移地址,用于形成20位物理地址。
另外,它们也可以作为通用寄存器和数据寄存器一样在运算过程中存放操作数,但只能以字(16位)为单位使用。
① 堆栈指针寄存器 SP(Stack Pointer)
指出在堆栈段中栈顶的偏移地址。
② 基址指针寄存器 BP(Base Pointer)
指出要处理的数据在堆栈段中的起始地址。特别值得注意的是,凡包含BP的寻址方式中,如无特别说明,其段地址由堆栈段寄存器SS提供。也就是说,该寻址方式是对堆栈区的存储单元寻址的。
③ 变址寄存器 SI(Source Index)、DI(Destination Index)
在存储器间接寻址方式中用来存放段内偏移量的全部或一部分。
在字符串操作指令中,SI用作源变址寄存器,DI用作目的变址寄存器。
(4)控制寄存器
① 指令指针寄存器 IP(Instruction Pointer)
用来存放下一条将要执行的指令在代码段中的偏移地址,程序员不可以直接使用,但程序控制类指令会用到。它具有自动加1功能,每当执行一次取指令操作,它将自动加1,总是指向下一条要取的指令在现行代码段中的偏移地址。它和CS相结合,形成指向指令存放单元的物理地址。
注意每取一个字节后IP内容加1,但取一个字后IP内容加2。
② 标志寄存器FLAGS
存放该处理器的程序状态字。
这是一个16位的寄存器,但实际上8086只用到9位——6位为状态标志位,3位为控制标志位。
如图3.9所示。

高八位:OF、DF+IF+TF。
a.状态标志位
反映了当前运算和操作结果的状态条件,可作为程序控制转移与否的依据。
CF(Carry Flag):进位标志位。算术运算指令执行后,若运算结果的最高位产生进位或借位,则CF=1;否则CF=0
PF(Parity Flag):奇偶标志位。反映运算结果中1的个数是偶数还是奇数。运算指令执行后,若运算结果的低8位中含有偶数个1,则PF=1;否则PF=0。
AF(Auxiliary carry Flag):辅助进位标志位。算术运算指令执行后,若运算结果的低4位向高4位产生进位或借位,则AF=1;否则AF=0。
ZF(Zero Flag):零标志位。若指令运算结果为0,则ZF=1;否则ZF=0。
SF(Sign Flag):符号标志位,它与运算结果的最高位相同。用补码运算时,它能反映结果的符号特征。
OF(Overfow Flag):溢出标志位。当补码运算有溢出时,则OF=1;否则OF=0。
b.控制标志位
可以由指令进行置位和复位,用来控制CPU的操作。
DF(Direction Flag):方向标志位。用于串操作指令,指定字符串处理时的方向。
DF=0时,每执行一次串操作指令,地址指针内容将自动递增;(正向)
DF=1时,地址指针内容将自动递减。可用指令设置或清除 DF位。(负向)
IF(Interrupt Enable Flag):中断允许(使能)标志位。用来控制8086是否允许接收外部中断请求。
设置IF=1时,允许响应可屏蔽中断请求;
设置IF=0时,禁止响应可屏蔽中断请求。
可用指令设置或清除IF位。
注意:IF的状态不影响非屏蔽中断清求(NMI)和CPU内部中断请求。
TF(Trap Flag):单步标志位(限踪标志位)。它是为调试程序面设定的陷阱控制位。
设置TF=1时,使CPU进入单步执行指令工作方式,此时CPU每执行完一条指令就自动产生一次内部中断;
当该位复位,,CPU恢复正常工作。
可用指令设置或清除TF位。
3.4 8086总线的工作周期
时钟周期(状态周期):指令的执行是在统一的时钟脉冲CLK的控制下,按节拍逐步进行的,一个时钟脉冲时间称为一个时钟周期,也称为一个T周期。
时钟周期由计算机的主频决定,是CPU的定时基准。
例如,8086的主频为5MHz,一个时钟周期为200ns。
总线周期(机器周期):8086CPU与外部交换信息总是通过总线进行的。CPU通过总线对存储器或外设I/O接口进行一次访同所需要的时间称为总线周期(Bus Cycle)。
一个基本的总线周期:由4个时钟周期组成——T1、T2、T3、T4。
一个总线周期完成一次数据传输,至少要有传送地址(T1)和传送数据(T2、T3、T4)两个过程。
① 在第一个时钟周期T1期间,由CPU输出地址;
② 在随后的3个时钟周期(T1、T3、T4)期间用以传送数据。
换言之,数据传运必倾在T2~T4这3个周期内完成,否则在T4周期后,总线将进行另一次操作,开始下一个总线周期。
等待周期 Tw:在实际应用中,当一些慢速设备在3个T周期内无法完成数据读/写时,在T4后总线就不能为它们所用,这会造成系统读/写出错——为此,在总线周期中允许插入等待周期Tw。
当被选中进行数据读/写的存储器或外设无法在3个T周期内完成数据读/写时,就由其发出一个请求延长总线周期的信号到8086 CPU的READY引脚,8086 CPU收到该请求后,就在T3与T4之间插入等待周期Tw,加入Tw的个数与外部请求信号的持续时间长短有关,Tw也以时钟周期T为单位,在Tw期间,总线上的状态一直保持不变。
空闲周期 Ti:如果在一个总线周期后不立即执行下一个总线周期,即总线上无数据传输操作,系统总线处于空闲状态,则这时执行空闲周期Ti,Ti也以时钟周期T为单位,两个总线周期之间插入几个Ti与8086 CPU执行的指令有关。
总线周期时序如图3.10所示。

指令周期:一条指令从开始取指令到最后执行完毕所需的时间称为一个指令周期。不同的指令因其操作性质不同,执行时间的长短可能不同,所以指令周期也就不同。
1个指令周期 = 若干总线周期 = 若干 * 4 个时钟周期
CPU执行某一个程序之前,先要把编译后的目标程序放到主存储器的某个区域。在启动执行后,CPU就发出读指令的命令,根据代码段寄存器CS和指令指针IP生成20位物理地址并将其输出到地址总线上,在存储器中读取相应的存储单元,把它送至CPU的指令寄存器中;CPU对读出指令经过译码器分析之后出一系列控制信号,执行指令规定的全部操作,控制各种信息在系统各部件之间传送。每条指令的执行由取指令、译码和执行等操作组成。
3.5 8086中断系统
8086中断系统可以直接识别和处理256个不同的中断源。
这256个中断源都有唯一的一个中断识别号——与中断类型码(0~255)一一对应。
3.5.1 8086中断类型
根据中断的产生原因,8086中断系统将256个中断源分为两大类:硬件中断、软件中断。

(1)硬件中断
中断起初是作为CPU与外围设备交换信息的一种同步控制方式而出现的,这类中断常称为硬件中断。
硬件中断(外部中断):又称外部中断,它是由处理器外部的硬件、外围设备的请求而引起的中断。
8086有两条硬件中断请求信号线:NMI(非屏蔽中断)、INTR(可屏蔽中断)
外围设备是通过中断请求线向CPU提出中断请求的。
① 可屏蔽中断
由INTR线上的中断请求信号引起的中断称为可屏蔽中断。
可屏蔽中断INTR受中断允许触发器状态(IF=1)的影响,这种请求可以用CPU指令CLI来屏蔽(使IF=0),也可以用指令STI允许(使IF=1)。
需要注意的是,出现在INTR线上的中断请求信号(即有效的高电平),必须保持到当前执行的指令结束为止。
(CPU执行完当前指令,才能响应中断信号)
CPU在当前指令周期的最后一个T状态,采样中断请求线INTR,若发现有可屏蔽中断请求,且中断是开放的(IF=1),则CPU转入中断响应周期。
8086进入2个连续的中断响应周期,每个响应周期都是由4个T状态组成,而且都发出有效的中断响应信号。请求中断的中断源必须在第2个中断响应周期的T3状态前,将其中断类型号送至CPU的数据总线。CPU在T4状态的前沿采样数据总线,获取中断类型号。
CPU根据中断类型号获取对应的中断服务程序入口地址,从而转去执行相应的服务程序。
在一个系统中,产生可屏蔽中断的中断源可以有多个,为了协助CPU按中断优先权高低处理多个中断源,系统中常采用专门的中断控制器8259配合工作,实现多个中断源的管理。
中断类型号在08H~0FH和070H~077H之间的中断属于这一级中断。

② 非屏蔽中断
由NMI线上的中断请求信号引起的中断称为非屏蔽中断。
非屏蔽中断的中断类型码为2。
非屏蔽中断NMI具有比可屏蔽中断NTR更高的优先权。当INTR、NMI线上同时发生中断申请时,CPU将首先响应NMI中断。
非屏蔽中断的特点是不受中断允许触发器IF状态的影响,即不能被CPU用指令CLI来屏蔽。当NMI线上出现一个由低到高的上跳边沿触发的中断请求信号后(持续时间需大于两个时钟周期,T周期),不管中断允许标志位IF的状态如何,都会在当前指令执行完以后,立即转入中断处理——转去执行中断类型号为2的非屏蔽中断的中断服务程序。
非屏蔽中断常用于紧急情况的故障处理。8086使用NMI中断服务程序对RAM奇偶校验错、I/O通道校验错、协处理器8087运算错进行处理。
(2)软件中断
随着计算机技术的发展和应用需求的提高,中断的概念也随之拓宽。除了传统的硬件中断外,又产生了软件中断的概念,在高档微处理器中则进一步丰富了软件中断的种类,延伸了其内涵,把许多在执行指令过程中产生错误的事件也纳入中断处理的范围。
软件中断(内部中断):由处理器内部事件产生的中断,又称内部中断。
它主要由指令驱动或由指令通过CPU状态间接驱动来引起中断。
软件中断有以下几种类型。
① 除法错中断
中断类型码为0。当执行DIV、IDIV指令时,若用零作除数,或者商超过了寄存器所能表达的范围,则无条件产生该中断。
② 单步中断
中断类型码为1。这是在调试程序过程中为单步运行程序提供的中断形式。当设定标志寄存器中陷阱标志TF=1时,CPU每执行完一条指令后就产生该中断。若TF=0,则处理器按正常方式连续执行指令。
在8086指令系统中没有能直接设置或改变TF的命令。若要设置或改变TF状态,则可以使用PUSHF指令把16位标志寄存器压入堆栈,并设法把栈顶16位字的第8位变为所要的状态(其他位不变),然后用POPF把栈顶字弹出到标志寄存器中。
③ 断点中断
中断类型码为3。这是在调试程序过程中为设置程序断点而提供的中断形式。设置断点——相当于插入INT 3指令,或执行INT 3指令可产生该中断。
④ 溢出中断
中断类型码为4。在算术运算程序中,若在算术运算之后加入一条INTO指令,则INTO指令将测试溢出标志OF。当OF=1(表示算术运算有溢出)时,该中断发生。
⑤ 中断指令INT n引起的中断
用户可用中断指令INT n产生指定类型n的任何中断。当执行这条指令时,CPU立即产生中断类型号为n的中断响应。
DOS操作系统和基本输入/输出系统BIOS提供了大量的软件中断来实现系统功能的调用。用户在程序设计中可以利用INT n指令直接引用这些系统功能。
(3)中断优先权
在以下中断中,8086规定中断优先权从高到低的顺序为①>②>③>④。
① 除法错、溢出中断指令INTO、中断指令INT n。
② 非屏蔽中断NMI。
③ 可屏蔽中断 INTR。
④ 单步中断。
3.5.2 中断向量与中断向量表
中断类型码(中断向量号、中断矢量号):为了区分各中断源,不同的中断源都有唯一标识的中断类型码。
向量中断:由,中断类型码,来查找中断入口地址,进而转向中断服务程序的方法,称为向量中断。
中断向量:每个中断类型码对应一个中断向量,即用来提供中断入口地址的一个地址指针。
8086 CPU的中断系统就是采用这种向量中断来实现中断源识别的。
每一个中断服务程序都有其唯一确定的入口地址——中断服务程序的段地址CS、偏移地址IP,共4 Byte。
中断向量表:把系统中每一个中断源的中断服务程序入口地址集中起来,按中断类型码的顺序存放在某一连续排列的存储区域内,这个存放中断入口地址的存储区就称为中断向量表。
8086系统的中断向量表如图3.11所示。

8086微机系统可提供256个不同类别的中断,由于每个中断入口地址需占用4B的地址空间,故其中断向量表需占用256×4=1KB的地址空间。
8086微机保留系统在其内存的最低端开辟了1KB的存储区(即地址为00000H~003FFH)作为中断向量表。
微机系统初始化时,系统顺序将各中断源(0~255)的中断服务程序入口地址填写在该表中。其中,中断类型码为n的中断向量为0000:4n,即对应的中断入口地址放在起始地址为0000:4n的连续4B的地址空间中。
低地址的两字节存放中断服务程序入口地址的偏移地址(IP),高地址的两字节存放中断服务程序入口地址的段基址(CS)。
这样,在响应中断时,CPU就可以根据所得到的中断类型码n,查找中断向量表,再从地址0000:4n开始的连续4B单元中获取中断源n的中断服务程序首地址
中断向量表建立了不同的中断源与其相应的中断服务程序首地址之间的联系,它使CPU在响应中断时可以依据中断类型码自动转向中断服务程序,是8086中断系统中特有的、不可缺少的组成部分。
3.5.3 8086中断处理过程
不同类型的中断,其中断响应过程也不完全相同。
下面分别描述可屏蔽中断、非屏蔽中断、软件中断的中断过程,以及中断类型码的形成。
如图所示

(1)可屏蔽中断的中断过程
8086 CPU通过中断控制器8259A管理外部可屏蔽中断。
① 中断源通过中断控制器8259向CPU发出中断请求信号。当有一个或多个外设向中断控制器8259发出中断请求时,8259经过识别、判优后通过INTR信号线向8086 CPU发出一个高电平的中断请求信号。(INT Require)
② CPU在每一个指令周期的最后一个时钟周期采样INTR信号线,若发现该信号线为高电平,即有中断源向CPU发中断请求,则CPU首先检测F标志位的值,如果IF=1,表示CPU允许中断,CPU开始响应中断;否则,CPU忽略该级中断请求,继续执行原程序或响应更高优先级的中断请求服务。
③ 当CPU响应可屏蔽级的中断请求时,首先通过~INTA信号线(低电平有效)向8259连续发出两个负脉冲的中断响应信号。CPU的第1个中断响应信号用来通知8259,CPU准备响应中断,要求8259准备好中断类型码;当8259接收到CPU发来的第2个中断响应信号以后,立即将准备好的中断类型码通过数据线送至CPU的内部数据寄存器中,以便CPU据此找到相应的中断服务子程序的入口地址。(INT Answer)
④ CPU暂停执行当前程序,而转去执行相应的中断处理程序。在这个过程中,CPU依次做如下处理:
Ⅰ 将标志寄存器FLAGS的当前值压栈保存。
Ⅱ 将标志寄存器中的中断允许标志位IF和单步标志位TF的值清零。将IF标志位清零是为了能够在中断响应过程中暂时屏藏来自同级的其他中断源的请求;将TF标志位清零是为了避免以单步方式执行中断服务程序。
Ⅲ 保护断点,即将寄存器CS和IP的值压栈保存,以便在中断处理程序执行完以后,能够正确地返回到原程序中继续执行。
Ⅳ 根据得到的中断类型号,从中断向量表中找到相应的中断服务子程序的入口地址,将其段地址和段内偏移地址分别装入代码段寄存器CS和指令指针寄存器IP中,从而使CPU转去执行相应的中断服务程序。
Ⅴ CPU执行中断服务程序。8086中断系统中,在执行中断处理的具体内容前,首先将中断服务过程中用到的各个寄存器的当前值压入堆栈进行保护,以免在中断服务过程中改变了这些寄存器的值,而导致中断处理程序执行完后,不能正确返回源程序继续执行,这个过程称为保护现场。
而在执行完中断处理的具体内容以后,再使用出栈指令,将先前保护的寄存器重新恢复为中断前的值,这就是恢复现场。
另外,在保护现场后,中断服务程序往往设置一条开中断指令,令IF标志位的值为1,使在中断服务结束后,允许同级其他中断源的中断请求进入。
Ⅵ 返回断点,继续执行被中断的程序。中断服务程序执行的最后一条指令是IRET指令(中断返回指令),该指令将保存在堆栈中的断点值和标志寄存器FLAGS的值弹出,重新装入CS、IP和标志寄存器中,从而完成恢复断点的工作。(Int RETurn)
(2)非屏蔽中断和软件中断的执行过程
非屏蔽中断、软件中断的中断响应、中断处理、中断返回等过程,与可屏蔽中断基本相同。
仅在中断请求、中断响应的条件上有所区别。
非屏蔽中断:通常是由系统板上的一些硬件故障引起的中断。首先,硬件通过NMI信号线向CPU发出高电平的中断请求信号。CPU在每一个指令周期的最后一个时钟周期采样NMI信号线,若发现该信号线为高电平,即有非屏蔽中断(系统中的2号中断)请求发生,CPU立即予以响应,而不受中断允许标志位IF的屏蔽。同时,非屏蔽级的中断类型号是系统事先约定好的,可以在CPU响应该级中断时,直接从2×4开始的连续4B单元中获取中断入口地址。
随后的中断处理、中断返回过程,与可屏蔽中断的第(4)步~第(6)步相同。
软件中断:中断过程更为简单,当CPU执行INT n指令时,即可产生软件中断,CPU根据指令提供的中断类型码,从中断矢量表中获取对应的中断入口地址,继而转至中断服务程序。
随后的过程与可屏蔽中断的第(4)步~第(6)步基本相同。
(3)中断类型码的形成
由前述可知,各类中断的中断类型码是在中断响应阶段获得的,但CPU获取中断类型码的方法因中断源的不同而有所不同,具体有以下几种:
① 多数软件中断:类型码是CPU根据异常类型(即系统内部事先定义的类型)在内部自动形成的。
② 软件中断指令INT n:类型码由指令本身给出,也是在内部自动形成的。
③ NMI:类型码被指定为2。因为它由系统内部事先定义,也不需要外部提供,所以本质上也是内部形成的。
④ INTR:类型码在CPU的两个中断响应周期中由中断源通过中断控制器(如8259A)提供。
3.6 8086微处理器外部基本引脚与工作模式
3.6.1 8086系统总线结构
为提高系统性能、耐用性及适应性,8086 CPU 设计为可工作在两种模式下:最小模式、最大模式
最小模式:用于由8086单一微处理器构成的小型系统;
最大模式:用于实现多处理机系统。
其中,8086 CPU被称为主处理器,其他处理器被称为协处理器。
引脚复用:为了减少芯片引脚个数,部分8086 CPU的外部引脚采用了复用技术。
复用引脚分为:按时序复用、按模式复用两种情况。
按时序复用:当CPU工作在不同的T周期时,这些引脚传送不同的信息;
按模式复用:则当CPU处于不同的工作模式(最小/最大)时,这些引脚具有不同的功能含义。
8086采用双列直插式(DIP)封装,具有40条引脚,使用+5V电源供电。
时钟频率有3种:5MHz(8086),8MHz(8086-1)、10MHz(8086-2)。
其引脚信号如图所示,括号内为最大模式时的引脚名称。

8086CPU的40条引脚信号按功能可分为四部分:
地址总线、数据总线、控制总线、其他(时钟与电源)。
它的引脚信号定义如表所示。


3.6.2 8086 CPU引脚信号
(1)地址总线、数据总线
数据总线:用来在 CPU 与 内存储器 or I/O设备之间交换信息,为双向、三态信号。16根
地址总线:由CPU发出,用来确定CPU要访问的内存单元或I/O端口的地址信号,为输出、三态信号。20根
在总线周期中,由于地址信息、数据信息在时间上不重叠,因此部分地址线与数据线共用一组引脚。
状态信号:用来指示CPU的状态信息,其中S6~S3和地址总线的高4位分时复用,7S与~BHE分时复用。
① AD15~AD0(双向,三态)
分时复用地址/数据总线,数据总线D15~D0、地址总线的低16位A15~A0复用。
★★★在每个总线周期的第一个时钟周期T1中,AD15~AD0用作地址总线的低16位A15~A0,给出内存单元或I/O端口的地址;
★★★在总线周期的其余时间(T2、T3、Tw、T4),AD15~AD0作为数据总线D15~D0使用。
② A19/S6~A16/S3(输出,三态)
分时复用的地址/状态复用信号。
★★★在每个总线周期的第一个时钟周期T1中,A19/S6~A16/S3用作地址总线的高4位A19~A16,在访问存储器时作为高4位地址,在访问I/O接口(16位寄存器)时,这4位置“0”(低电平)。
★★★在总线周期的其余时间(T2、T3、Tw、T4),这4条信号线指示CPU的状态信息S6~S3。
S6恒为低电平,表明8086 CPU当前正与总线相连;
S5反映标志寄存器中中断允许标志IF的当前值;
S4 和 S3组合起来指示当前正在使用的是哪个段寄存器,其编码如表3.3所示。


③ ~BHE/S7(输出,三态)
高8位数据总线允许信号、状态信号。它也是一个分时复用引脚。
★★★在总线周期的T1状态,作为高8位数据总线允许信号,A19~A1输入高字节块找数据,低电平有效。当~BHE=0时,表示高8位数据总线AD15~AD8上的数据有效;当~BHE=1时,表示高8位数据总线AD15~AD8上的数据无效,当前仅在数据总线AD7~AD0上传送8位数据。
★★★在T2、T3、Tw 、T4状态,此引脚输出状态信息S7,在8086微处理机系统中,S7没有定义。
~BHE和 AD0相配合访问存储器见表3.1(3.2.1节)。
(2)控制总线
控制总线共有16根引脚。
其中引脚24~31在两种工作模式下定义的功能有所不同,其余的在两种工作模式下信号功能相同。
① 共用控制引脚信号
~RD(输出、三态):读信号,低电平有效。
RD=0时,表明CPU要进行一次内存或I/O端口的读操作,具体是对内存还是I/O端口进行读操作,决定于M/~IO信号。
READY(输入):准备就绪信号。是来自存储器或I/О端口的应答,高电平有效。
当READY=1时,表示内存或I/О端口准备就绪,马上可进行一次数据传输。CPU在每个总线周期的T3时钟周期开始处对 READY信号采样,若检测到READY信号为低电平,则在T3后插入一个Tw等待周期。在Tw时钟周期,CPU再对READY信号采样,若仍为低电平,就继续插入Tw等待周期……直到 READY信号变为高电平,才进入T4时钟周期,完成数据传送。
~TEST(输入):测试信号,低电平有效。用来支持构成多处理器系统,实现8086CPU与协处理器之间同步协调的功能,只有当CPU执行 WAIT指令时才使用,是 WAIT指令结束与否的条件。
当CPU执行WAIT指令时,CPU每隔5个时钟周期就对此引脚进行测试。若测试到该引脚为高电平,则CPU处于空转状态进行等待;若测试为低电平,则CPU结束等待状态,继续执行下一条指令。
INTR(输入):可屏蔽中断请求信号,高电平有效。当INTR为高电平时,表示外部有中断请求。
CPU在每条指令的最后时刻检测INTR引脚,若为高电平,且当前CPU允许中断(中断允许标志IF=1),那么,CPU就会在结束当前执行的指令后,响应中断请求,进入中断处理子程序。

NMI(输入):非屏蔽中断请求信号,上升沿有效。当NMI引脚输入一个由低到高的上升沿时,CPU就会在结束当前执行的指令后,进入非屏蔽中断处理子程序。
RESET(输入):系统复位信号,高电平有效信号(至少保持4个时钟周期)。在RESET信号来到后,CPU结束当前操作,并将处理器中的寄存器FLAGS、IP、DS、SS、ES及指令队列清零,将CS设置为0FFFFH。当复位信号变为低电平时,CPU 从FFFF0H 开始执行程序,实现系统的重启动过程。系统加电或操作员按下RESET键后会产生RESET信号。
MN/~MX(输入):工作模式控制信号。决定CPU工作在最小模式或最大模式。
此引脚接+5V电源时,CPU处于最小模式;接地时,CPU处于最大模式。
② 最小模式下的控制引脚信号
~INTA(输出):CPU发向中断控制器的中断响应信号,低电平有效。在两个连续的总线周期输出两个低电平信号,第一个低电平用来通知外设,CPU准备响应它的中断请求,在第二个低电平期间,外设通过数据总线送入它的中断类型码,并由 CPU读取,以便取得相应中断服务程序的入口地址。
ALE(输出):地址锁存允许信号,高电平有效。当ALE信号有效时,表示地址线上的地址信息有效,利用它的下降沿把地址信息和~BHE信号锁存在地址锁存器中。ALE不能浮空。
~DEN(输出、三态):数据允许信号,低电平有效。当DEN信号有效时,表示CPU准备好接收和发送数据。在最小模式中,DEN信号就是总线收发器的选通信号,总线收发器将~DEN作为输出允许信号。
DT/~R(输出、三态):数据发送/接收信号。表示CPU是接收数据(低电平-receive),还是发送数据(高电平-trasmit),用于控制总线收发器数据传送的方向。
M/~IO(输出、三态):存储器/输入、输出控制信号。用于区分是访问存储器(高电平),还是访问I/O端口(低电平)。——memery、IO
~WR(输出):写信号,低电平有效。当WR=0时,表明CPU正在执行向存储器或I/O端口的输出操作。
HOLD(输入):总线请求信号,高电平有效。此引脚是系统中其他总线主设备向CPU提出总线请求的输入信号。CPU让出总线控制权直到这个信号撤销后才恢复对总线的控制权。
HLDA(输出):总线响应信号,高电平有效。它是CPU对系统中其他总线主控设备请求总线使用权的应答信号。当CPU让出总线使用权时,就发出这个信号,并使CPU所有具有三态的引脚处于高阻状态,与外部隔离。
在最小模式下,8086 CPU直接产生全部总线控制信号(DT/~R,~DEN,~ALE,M/~IO)和命令输出信号(~RD、~WR或~INTA),并提供请求访问总线的逻辑信号HLDA。当总线主控设备(例如 DMA 控制器Intel 8257/Intel 8237)请求总线控制权时,它向8086发送一个总线请求信号HOLD,如果8086 CPU响应 HOLD请求,则8086 CPU输出响应信号HLDA,通知DMA 控制器可以使用系统总线,同时使8086 CPU 的地址总线、数据总线、~BHE信号以及有关的总线控制信号和命令输出信号处于高阻状态。此外,地址锁存器和数据收发器的输出也处于高阻状态。这样,8086 CPU不再控制总线,一直保持到 HOLD信号变为无效,8086 CPU重新获得总线控制权为止。DMA 控制器接收到来自CPU的响应信号后,掌握系统总线控制权,进行数据传送。当DMA 控制器完成传送任务时,撤销发向CPU的总线请求信号,CPU重新获得对系统总线的控制权。
③ 最大模式下的控制引脚信号
~S2、~S1,~S0(输出,三态):总线周期状态信号。这三位的组合表示当前总线周期的操作类型。如表3.4所示。

总线控制器8288接收这3位状态信息,译码产生相应的存储器读/写命令、I/O端口读/写命令及中断响应信号。
当~S2、~S1、~S0中的任意一个为低电平时,都对应某一种总线操作,此时称为有源状态。而当一个总线周期即将结束(T3期间或Tw周期),另一个总线周期尚未开始,并且 READY信号也为高电平时,~S2、~S1、~S0都变为高电平,此时称为无源状态。在前一个总线周期的T4时钟周期时,只要~S2、~S1、~S0中有一个变为低电平,就意味着即将开始一个新的总线周期。而在T3或Tw期间返回无效状态,则表示一个总线周期的结束。在 DMA(直接存储器存取)方式下,~S2、~S1、~S0处于高阻状态。
QS1、QS0(输出):指令队列状态信号。用于指示8086内部BIU中指令队列的状态,以便外部协处理器跟踪8086 CPU内部指令序列。QS1和QS0表示的状态如表3.5所示。

外部逻辑通过监视总线状态和队列状态,可以模拟CPU的指令执行过程,并确定当前正在执行哪一条指令。有了这种功能,8086才能告诉协处理器何时准备执行指令。
~RQ/~GT0、~RQ/~GT1(双向):总线请求信号/总线请求响应信号,低电平有效。这两个信号是为多处理机应用而设计的,用于对总线控制权的请求和应答,其特点是请求和允许功能用一根信号线来实现,每一个引脚都可代替最小模式下 HOLD/HLDA两个引脚的功能。这两个引脚可同时接两个协处理器,~RQ/~GT0的优先级高于~RQ/~GT1。
总线访问的请求/允许时序分为3个阶段:请求、允许和释放。首先是协处理器向8086输出~RQ请求使用总线,然后在8086 CPU的T4或下一个总线周期的T1期间,CPU输出一个宽度为一个时钟周期的脉冲信号~GT0给请求总线的协处理器,作为总线响应信号;从下一个时钟周期开始,CPU释放总线。当协处理器使用总线结束时,再给出一个宽度为一个时钟周期的脉冲信号~RQ给CPU,表示总线使用结束,从下一个时钟周期开始,CPU又控制总线。
~LOCK(输出、三态):总线封锁信号,低电平有效。LOCK信号用来封锁外部处理器的总线请求。当~LOCK=0时,表明CPU不允许其他总线主控设备占用总线。~LOCK信号通过指令在程序中设置,若一条指令加上前缀LOCK,则8086在在执行指令期间,~LOCK输出低电平并保存到该指令执行结束,以保证该指令在执行期间不会被外部处理器的总线请求所打断。
(3)其他信号
① CLK(输入):时钟信号。为处理器提供基本的定时脉冲和内部的工作频率。8086CPU 要求时钟信号的占空比(正脉冲与整个周期的比值)为33%,即1/3周期高电平,2/3周期低电平。
② Vcc(输入):电源。要求接正电压(+5±0.5V) 。
③ GND(输入):地线。8086 CPU有两条接地线。
3.6.3 8086 CPU的最小工作模式
8086 CPU的 MN/~MX引脚接+5V电源时,CPU处于最小模式,是单一微处理器构成的小型系统。
总线:计算机各种功能部件之间传送信息的公共通路,连接到总线上的功能模块有主动和被动两种方式。
主设备可以启动一个总线周期,而从设备只能响应主设备的请求。某一时刻总线上只能有一个主设备占用总线。
CPU在不同的时间可以用作主设备,也可用作从设备;而存储器则只能用作从设备。
在最小模式中,作为单处理器的8086通常控制着系统总统,但也允许系统中的其他设备占用总线。例如直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA 控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在内存和I/O设备之间进行,一般用于高速传送成组数据。DMA 控制器在传送数据时,需要使用总线,这时 DMA 控制器向8086发送一个总线请求信号,在CPU允许并响应的情况下,DMA 控制器获得总线控制权,使用完后,又将总线控制权交还给CPU。
8086 CPU在最小模式下的典型配置如图3.14所示

8086的最小模式具有以下几个特点。
① MN/~MX引脚接+5V电源,决定了CPU工作在最小模式下。
② 使用一片8284,作为时钟信号发生器。
③ 使用3片 74LS373 或 Intel 8282,作为地址锁存器(总线锁存器)。
④ 当系统中所连的存储器和外设端口较多时,需要增强数据总线的驱动能力,用两片74LS245 或8286/8287作为总线收发器(数据收发器)。
(1)时钟发生器
8284是用于8086系统的时钟发生器芯片,它为8086及其他外设芯片提供恒定的时钟信号,对准备信号(READY)及复位信号(RESET)进行同步。
外界控制信号 RDY 及~RES信号可以在任何时刻到来,8284能把它们同步在时钟下降沿时输出 READY 及RESET信号到8086 CPU。
8284由时钟信号发生器、复位生成电路和就绪控制电路三部分组成,其引脚图如图3.15所示。

时钟信号发生器产生恒定的时钟信号,复位信号发生电路产生系统复位信号RESET,就绪信号控制电路用于对存储器或/O接口产生的准备好信号READY进行同步。
8284 的典型连接如图3.16所示。

振荡源一般采用晶体振荡器,在X1与X2引脚间接上晶体,由晶体振荡器产生时钟信号。另外也可以由EFI引脚加入的外接脉冲发生器作为振荡源,产生时钟信号。此时8284的F/~C引脚应接高电平。8284输出的时钟频率为振荡源频率的1/3。
(2)地址锁存器
8086 CPU的地址/数据总线是复用的,~BHE和S7也是复用的,在总线周期的T1时钟周期传送地址信息和~BHE信号,而在其他时钟周期传送数据、状态信息。为避免丢失地址信息和~BHE信号,需在它们失效前将其锁存至地址锁存器,为地址总线提供存储器或I/O接口地址。当ALE信号有效时,表示地址线上的地址信息有效,在 ALE信号下降沿把地址信息和~BHE信号锁存在地址锁存器。在总线周期的其余时间(T2、T3、Tw和T4状态),复用的地址/数据总线作为数据总线使用,实现CPU对锁存器和I/O设备的读/写操作。
常用的地址锁存器芯片有74LS373、74LS273、Intel 8282和Intel 8283等。系统配置图中的3片74LS373芯片用来锁存地址/数据总线AD15~AD0中的地址信息、地址/状态总线A19~A16/S6~S3中的地址信息及~BHE/S7中的~BHE信息。其中每片74LS373芯片锁存8位信息。
(3)总线收发器
当一个系统中所含的外设接口较多时,数据总线上需要有发送器和接收器来增加驱动能力。发送器和接收器简称为总线收发器或总线驱动器。
总线收发器芯片74LS245是8位的。所以在8086系统中,需要用两片74LS245对AD15~AD0中的数据信息进行缓冲和驱动。注意该芯片在8086总线周期的第二个时钟周期T2开始工作,因为T1周期时AD15~AD0上输出的是地址信息。
常用的总线收发器芯片有74LS245、 Intel 8286 和 Intel 8287等。
3.6.4 8086 CPU的最大工作模式
在最小模式中,,然可以通过 DMA 控制器实现外部设备与存储器之间的直接数据传输,提高了整个系统的能力,但 DMA控制器却不能执行指令,其能力是相当有限的。假如系统中有两个或多个同时执行指令的处理器,构成多处理器系统,就可以有效地提高整个系统的性能。增加的处理器可以是8086处理器,也可以是协处理器。协处理器只是协助主处理器完成某些辅助工作。和8086配套使用的协处理器有两个:一个是用于数值计算的协处理器8087,通过硬件实现高精度整数浮点运算;另一个是专用于输入/输出操作的协处理器8089,8089有一套专门用于输入/输出操作的指令系统,可以直接为输入/输出设备服务。增加协处理器后,使得浮点运算和输入/输出操作不再占用8086 CPU的时间,从而大大提高了系统的运行效率。
在处理多处理器系统时,除了解决对存储器和Ⅰ/O设备的控制、中断管理、DMA传送时总线控制权的问题外,还必须解决多处理器对系统总线的争用问题,以及处理器之间的通信问题。因为多个处理器通过公共系统总线共享存储器和I/O设备,所以必须增加相应的逻辑电路,以确保每次只有一个处理器取回执行结果,必须提供一种明确的方法来解决两个处理器之间的通信。8086 CPU 的最大工作模式就是专门为实现多处理器系统而设计的。在这种方式下,8086 CPU不直接提供用于存储器或I/О接口访问的读/写命令等控制信号,而是由总线控制器8288产生总线命令和控制信号,对存储器和I/О端口进行读/写控制。
当8086 CPU的MN/~MX引脚接地时,8086 CPU工作于最大模式,用于构成多处理机系统,图3.17所示为最大模式下8086系统配置。可以看出,同最小模式下8086系统配置相比较,最大模式系统增加了一片专用的总线控制器8288


8086的最大模式具有以下几个特点。
① MN/~MX端接地,决定了 CPU工作在最大模式下。
② 使用一片8284,作为系统时钟。
③ 使用三片8282或74LS373,作为地址锁存器。
④ 使用两片8286/8287,作为总线收发器。
⑤ 使用一片8288,作为总线控制器。
//⑥ 使用一片8259,对多个中断源进行中断优先级的管理。
(1)总线控制器
最大模式系统中,一般包含两个或多个处理器,这就需要解决主处理器和协处理器之间的协调工作,以及对系统总线的共享控制问题,8288总线控制器就起了这个作用。它根据8086在执行指令时提供的总线周期状态信号~S2、~S1、~S0来建立控制时序,与输入控制信号IOB、~AEN、CEN和CLK相配合,产生读/写控制命令。通过8288可以提供灵活多变的系统配置,以实现最佳的系统性能。
8288由状态译码器、命令信号发生器、控制信号发生器及控制逻辑组成,其内部结构和引脚信号如图3.18所示。

8288接收8086的总线周期状态信号~S2、~S1、~S0,确定当前总线周期的操作类型,译码产生相应的存储器读/写命令、I/O端口读/写命令及中断响应信号。~S2、~S1、~S0的代码组合对应的总线操作类型如表所示。

8288总线控制器产生的总线控制命令如下。
① ~IORC、~IOWC:I/O读、写命令。
② ~MRDC、~MWTC:存储器读、写命令。
③ ~AIOWC、~AMWC:超前命令。这两个超前命令比~IOWC和~MWTC出现时间早一个时钟周期,在需要提前发出写命令的场合,可以选用这两个超前信号,从而能够在一定程度上避免微处理器进入等待状态。
④ ~INTA:中断相应命令。
⑤ ALE:地址锁存允许信号。用于将地址选通到地址锁存器,高电平有效,在下跳沿锁存。
⑥ DEN:数据使能信号。DEN为高电平时,接通数据收发器。
⑦ DT/~R:数据发送/接收信号。用来控制数据收发器的传送方向,DT/R=1为发送状态;DT/R=0为接收状态。
⑧ MCE/~PDEN:主设备使能/外设数据允许命令。这是一条双重功能的控制线,当8288工作于系统总线方式时,用作主控级联允许信号MCE,在中断响应周期的T1状态时有效,控制主8159A向从8259A输出级联地址;当8288工作于I/O总线方式时,用作外设数据允许信号~PDEN,控制外围设备通过I/O总线传送数据。
8288的工作受输入控制信号的控制,这些信号是IOB、~AEN、CEN 和CLK。
① IOB:输入/输出总线方式。8288既可控制系统总线,又可以控制I/О总线。当IOB=0时,8288处于系统总线方式;当IOB=1时,8288处于I/O总线工作方式,8288仅用来控制I/O总线。
② AEN:地址使能。由总线仲裁器8289输入,是支持多总线结构的同步控制信号。当AEN=1时,8288各种命令无效,呈高阻态;当AEN=0时,在系统总线方式下,至少在AEN有效后115ns,8288才能输出命令,这段时间进行总线切换;在I/О总线方式下,AEN不起作用,不影响I/O命令的发出。
③ CEN:命令使能。当有多片8288协同工作时起片选作用。当CEN=1时,允许该8288发出全部控制命令;当CEN=0时,禁止该8288发出总线控制信号,同时使 DEN、~PDEN呈高阻状态。
④ CLK:时钟信号。8288产生命令和控制信号输出时,由CLK决定它们的定时关系。通常由微机的系统时钟提供。
(2)时钟发生器、地址锁存器和总线收发器
由图3.17可知,在最大配置中,这3种部件的工作与最小配置相同。
(3)需要说明的问题
① 8086 CPU在最小模式下的 HOLD和 HLDA引脚在最大模式下成为~RQ/~GT0和~RQ/~GT1信号线,这两条引脚通常同8087(协处理器)或8089(I/O处理器)相连接,用于8086同协处理器之间传送总线请求与总线应答信号。
② 当系统为具有两个以上主CPU的多处理器系统时,必须配备总线仲裁器8289,与8288相配合确定总线使用权的分配,从而保证系统中的各个处理器同步地进行工作,实现总线共享。
③ 在最大模式的系统中,一般还有中断优先级管理部件8259A,用于对多个中断源进行中断优先级的管理。但如果中断源不多,则也可以不用中断优先级管理部件。
3.7 8086微处理器的时序
3.7.1 系统的复位与启动
3.7.2 最小模式系统总线周期时序
3.7.3 最大模式系统总线周期时序
3.8例题解析
……
更多推荐



所有评论(0)