第七章 输入/输出与中断
7.1 I/O接口概述
7.1.1 I/O接口的作用
I/O接口的作用
接口是介于CPU和外设之间的一种缓冲电路
在CPU和外设之间起到速度匹配、信号转换等作用
7.1.2 CPU与外设交换的信息
主机与I/O设备之间交换的信息可分为数据信息、状态信息和控制信息三种。
1.数据信息
① 数据信息 它是CPU与外设之间传送的主要信息,可分为数字量、模拟量和开关量三种形式。
2.状态信息
② 状态信息 是外设送往CPU的信息,作为外设与CPU之间交换数据的联络信号,反映了当前外设所处的工作状态。
3.控制信息
③ 控制信息 是CPU通过接口传送给外设的信息,用来设置外设(包括接口)的工作方式、控制外设的工作等。
7.1.3 I/O接口的基本结构
I/O端口是接口中存放不同信息的寄存器 。
接口和端口是两个不同的概念,若干个端口加上相应的控制电路才构成接口。
一个典型的IO接口如下图所示。首先,地址总线经过译码确定要进行信息交互的I/O接口;然后在控制总线控制信号的驱动下进行数据的交互,数据存在于I/O接口的数据缓冲器中,然后通过内部总线在三种寄存器之间传输,最终与I/O设备进行交互。
7.1.4 I/O端口的编址
接口中每个端口都有一个地址编号,称为端口地址。
微机系统中,I/O端口的编址方式有两种,即:统一编址和独立编址
1.统一编址
I/O端口的统一编址方式
对I/O端口和存储单元统一编排地址号,由I/O端口地址和存储单元地址共同构成一个统一的地址空间。
统一编址(存储器映射I/O编址):即把I/O端口的地址也看作是一个内存单元,与内存地址统一混合编址。
优点:对外设的操作可以直接使用对内存操作指令,指令较多、使用方便。
缺点:内存空间减少,采用内存操作指令的速度比专用I/O指令慢。
2.独立编址
I/O端口的独立编址方式
建立了两个地址空间,一个为内存地址空间,一个为I/O地址空间。内存地址空间和I/O地址空间是相对独立的。
80x86 CPU组成的微机系统都采用独立编址方式。
独立编址(I/O映射编址):即I/O端口与内存分开独立编址,二者各有一套地址空间,井水不犯河水。这样编址的微处理器都有个M/-IO信号,当使用MOV指令时它自动变成高电平,用IN/OUT指令时它自动变成低电平,
优点:
1、存储器地址空间不受I/O端口地址空间的影响
2、专用的输入/输出指令与访问存储器指令有明显区别,便于理解和检查。
缺点:
1、专用I/O指令增加了指令系统复杂性,且I/O指令类型少,程序设计灵活性较差;
2、要求CPU提供专门的控制信号以区分对存储器和I/O端口的操作,增加了控制逻辑的复杂性。
7.2 CPU与外设之间数据传送的方式
7.2.1 程序传送方式
该方式完全通过执行程序中的I/O指令来控制CPU与外设之间的数据交换
分为无条件传送和查询传送(有条件传送)
1.无条件传送
CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。
无条件传送方式的特点
优点:程序设计和接口电路都很简单。
缺点:在输入输出数据时不考虑外设的状态默
认外设总是准备好的
适用于:与简单外设进行少量的不频繁的数据传送
2.查询传送方式
传送数据前,先测试外设的状态,待外设准备就绪后,再执行I/O指令进行数据传送,否则循环测试等待。
查询传送方式的特点
优点:能保证主机与外设之间协调同步地工作,且硬件
线路比较简单,程序也容易实现。
缺点:浪费CPU时间,实时性差。
适用于:数据输入/输出不太频繁且外设较少、对实时
性要求不高的情况。
7.2.2 中断传送方式
中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转去执行数据的输入/输出操作(即中断处理),数据传送结束后,CPU再继续执行被暂停的程序。
中断传送方式的特点
优点: CPU与外设可以并行工作,不必查询等待,
工作效率高;系统实时性比查询方式要好得多。
缺点: 接口电路相对复杂,每进行一次数据传送都
要转去执行中断处理程序,都要进行断点和
现场的保护和恢复,浪费了很多CPU的时间。
适用于:少量的数据传送。
7.2.3 直接存储器存取(DMA)传送方式
DMA方式适合于在外设和存储器之间进行大批量的高速数据交换,数据的传送不依赖CPU执行I/O指令,而是直接由专用的接口芯片DMA控制器(DMAC)来控制。
传送过程中,CPU暂停指令的执行并让出总线控制权,由DMA控制器接管总线的控制权。传送过程全部由硬件实现,所以传送速率非常高。
7.3 中断技术
7.3.1 中断的基本概念
1. 中断的定义
计算机在执行正常程序过程中,当出现某种异常事件或某种外部请求时,处理器就暂停执行当前的程序,而转去执行对异常事件或某种外部请求的处理操作。当处理完毕后,CPU再返回到被暂停执行的程序,继续执行,这个过程称为程序中断。
中断系统为实现中断功能而设置的硬件电路和与之相应的软件,称为中断系统。
2. 中断源
引起中断的原因或发出中断请求的来源称为中断源。中断源可分为硬件中断源和软件中断源两类。
3. 中断处理过程
对于单个中断源的中断处理过程应包括中断请求、中断响应、保护断点、中断处理和中断返回等五个过程。
① 中断请求:是中断源向CPU发出的请求中断的要求。
软件中断源是在CPU内部由中断指令或程序出错直接发中断;
硬件中断源必须通过专门的电路将中断请求信号送给CPU,CPU也有专门的引脚接收中断请求信号。
② 中断响应:是指当计算机系统接收到中断请求后应作出的反应。对于可屏蔽中断的响应要具备两个条件:一是中断允许触发器的状态为1(即开中断),二是CPU在执行完现行指令之后。
③ 保护断点:所谓断点是指处理完中断后返回主程序时执行的第一条指令的地址。保护断点是为了在中断处理结束后能正确返回。
④ 中断处理:是指执行中断服务子程序,完成中断服务功能。主要包括保护现场、中断服务和恢复现场等过程。
⑤ 中断返回:是指执行完中断服务程序后返回到被中断的主程序的断点处,继续向下执行,即恢复断点。
7.3.2中断优先级和中断的嵌套
1.中断优先级
中断请求是随机发生的,当系统具有多个中断源时,有时会同时出现多个中断请求,CPU只能按一定的次序予以响应和处理,这个响应的次序称为中断优先级。
对于不同级别的中断请求,一般的处理原则是:不同按高低 低级让高级 高级封低级 同级等处理
不同按高低 不同优先级的多个中断源同时发出中断请求,按优先级由高到低依次处理。
低级让高级 低优先级中断正在处理,出现高优先级请求,应转去处理高优先级请求,服务结束后再返回原优先级较低的中断服务程序继续执行。(即中断嵌套)
高级封低级 高优先级中断正在处理,出现低优先级请求,可暂不响应。
同级等处理 中断处理时,出现同级别请求,应在当前中断处理结束以后再处理新的请求。
2.中断优先级的确定
微机系统中通常用三种方法来确定中断源的优先级别,即:
- 软件查询法
- 硬件排队电路法
- 专用中断控制芯片法
1)软件查询法
软件查询法需要简单的硬件电路支持。以8个中断源为例,其硬件电路如图7.13所示,将8个外设的中断请求组合起来作为一个端口(中断寄存器),并将各个外设的中断请求信号相或,产生一个总的INT信号。
采用软件查询方式,各中断源的优先级是由查询顺序决定的。
优点:节省硬件
缺点:CPU每次响应中断时都要对各中断源进行逐一查询,所以其响应速度较慢。对于优先级较低的中断源来说,该缺点更为明显。
2)硬件排队电路法
各个外设的优先级与其接口在排队电路中的位置有关。响应信号沿链式电路进行传递时,最靠近CPU并发出中断请求的接口将首先拦截住响应信号。
3)专用中断控制芯片法
软件查询和硬件排队法虽然可以解决中断优先级控制问题,但实现起来在硬件和软件上都要做大量的工作,十分麻烦。较为方便的办法就是利用可编程中断控制器,例如广泛应用于80x86微机系统中的专用可编程中断控制芯片Intel 8259A,可以实现单片管理8级中断,通过级联最多可以用9片8259A管理64级中断。
7.4 8086/8088中断系统
7.4.1 8086/8088的中断源类型
8086/8088 CPU可以处理256种不同类型的中断,每一种中断都给定一个编号(0255),称为中断类型号,CPU根据中断类型号来识别不同的中断源。
8086/8088的中断源如图7.17所示。
8086/8088中断源的优先级顺序由高到低依次为:
软件中断(除单步中断外)
非屏蔽中断
可屏蔽中断
单步中断
7.4.2 中断向量表
中断向量 是中断服务子程序的入口地址。
中断向量表是存放中断向量的一个特定的内存区域。
8086/8088共有256个中断类型号,对应256个中断服务程序的入口地址。所有中断服务子程序的入口地址都存放在中断向量表中。每个入口地址的段地址和段内偏移地址占4个存储单元,所以其中断向量表长度为1K(256×4)个单元。8086/8088系统的中断向量表位于内存的前1K字节,地址范围为00000H~003FFH。
CPU响应中断时,把中断类型号N乘以4,得到对应地址4N,然后把由此地址开始的两个低字节单元(4N,4N+1)的内容装入IP寄存器,再把两个高字节单元(4N+2,4N+3)的内容装入CS寄存器,于是CPU转入中断类型号为N的中断服务子程序。
7.4.3 8086/8088的中断处理过程
7.4.4中断服务程序的设计
中断服务程序的一般结构如图所示。如前所述,在进入中断处理前,硬件已自动关中断,若想让该中断处理能被更高级别的中断源中断,则需事先加入开中断指令。中断服务程序的最后一定要有中断返回指令IRET,以保证断点的恢复。
用户在设计中断服务程序时要预先确定一个中断类型号,确定了中断类型号,还要把中断服务入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。
将中断服务程序入口地址置入中断向量表的方法有两种:DOS系统功能调用法和直接装入法。
1.中断向量表的建立
1.DOS系统功能调用法(INT 21H)
功能号:
(AH)=25H。
入口参数:
(AL)=中断类型号
(DS)=中断服务程序入口地址的段地址
(DX)=中断服务程序入口地址的偏移地址
如中断服务子程序名为INT60,中断类型号为60H
PUSH DS ;保护DS
LEA DX,INT60 ;取服务程序偏移地址
MOV AX,SEG INT60;取服务程序段地址
MOV DS,AX
MOV AH,25H ;送功能号
MOV AL,60H ;送中断类型号
INT 21H ;DOS功能调用
POP DS ;恢复DS
2.直接装入法
用传送指令直接将中断服务子程序首地址INT60置入向量表中。设中断类型号为60H(此类型号对应的向量表地址为从00180H即0000H: 0180H开始的四个连续存储单元)。程序段如下:
XOR AX,AX
MOV DS,AX
MOV AX,OFFSET INT60
MOV DS:[0180H],AX ;置偏移地址
MOV AX,SEG INT60
MOV DS:[0180H+2],AX;置段地址
2.编程举例
编写中断服务程序实现在屏幕上显示字符串“This is a Interruption Service Program!”。设中断类型号取60H,采用DOS功能调用法置中断服务程序入口地址,通过软中断指令INT 60H实现中断服务程序的调用。程序设计如下:
int_1.asm
DATA SEGMENT
MESG DB 'This is a Interruption Service Program!$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
PUSH DS
MOV DX,OFFSET DISP60 ;取DISP60的偏移地址
MOV AX,SEG DISP60 ;取中断服务程序DISP60的段地址
MOV DS,AX
MOV AH,25H
MOV AL,60H
INT 21H
POP DS
INT 60H
MOV AH,4CH
INT 21H
DISP60 PROC FAR ;中断服务程序DISP60
MOV DX,OFFSET MESG
MOV AH,09H
INT 21H
IRET
DISP60 ENDP
CODE ENDS
END START
在本例的中断服务程序中无须保护现场和恢复现场。
结果1
说明:此为VS CODE执行结果
其中,Do you need to keep the DosBox[Y,N]
不是程序本身的输出结果
int_2.asm
DATA SEGMENT
MESG DB 'This is a Interruption Service Program!$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
PUSH DS
XOR AX,AX
MOV DS,AX
MOV AX,OFFSET DISP60
MOV DS:[0180H],AX ;置偏移地址
MOV AX,SEG DISP60
MOV DS:[0180H+2],AX;置段地址
POP DS
INT 60H
MOV AH,4CH
INT 21H
DISP60 PROC FAR ;中断服务程序DISP60
MOV DX,OFFSET MESG
MOV AH,09H
INT 21H
IRET
DISP60 ENDP
CODE ENDS
END START
结果2
说明:此为VS CODE执行结果
其中,Do you need to keep the DosBox[Y,N]
不是程序本身的输出结果
7.5可编程中断控制器Intel 8259A
略