760 likes | 893 Views
第五章 中断接口技术. 本章重点: 中断的基本概念 IBM-Pc 机中断系统 可编程中断控制器8259. 5.1 中断的基本概念. 一、中断的概念 1、什么是中断? 是微机系统重要的功能之一,其主要目的是当系统出现一些紧急情况,需要暂停正常程序运行并插入临时处理程序时,计算机能正确地打断主程序,然后转入相应的中断处理程序,服务完后再返回到主程序。 2、中断的用处 :以中断的方式 响应外设的请求 ,或 进行异常情况处理 等。对于计算机接口管理来讲,由于有了中断功能, CPU 可以不必经常查询外围接口, 提高 CPU 的利用率 。. CPU 执行流程.
E N D
第五章 中断接口技术 • 本章重点: • 中断的基本概念 • IBM-Pc机中断系统 • 可编程中断控制器8259
5.1 中断的基本概念 • 一、中断的概念 • 1、什么是中断? • 是微机系统重要的功能之一,其主要目的是当系统出现一些紧急情况,需要暂停正常程序运行并插入临时处理程序时,计算机能正确地打断主程序,然后转入相应的中断处理程序,服务完后再返回到主程序。 • 2、中断的用处:以中断的方式响应外设的请求,或进行异常情况处理等。对于计算机接口管理来讲,由于有了中断功能,CPU可以不必经常查询外围接口, 提高CPU的利用率。
CPU执行流程 非预料事件1 中断服务程序1 非预料事件 2 中断服务程序 2
中断用途举例 • 下面以PC机的键盘管理为例说明使用中断功能的好处: • 每次击键对CPU产生一次中断请求,CPU在处理完当前指令之后,暂停当前程序,响应键盘中断,去执行键盘服务程序,CPU在完成接收键入信息的程序之后,自动回到原程序的断点处去执行下一指令。这样,避免了CPU不断查询键盘等待有键按下的循环操作。提高了CPU的利用率。
中断源 1、什么是中断源: 发出中断请求的外部设备或引起中断的内部原因称为中断源。 2、中断源的种类: (1)当中断由中断指令INT n产生时,指令中的n为中断向量 (2)当中断是由异常情况产生的时,CPU将会通过硬件逻辑自动产生中断向量 (3)当中断是由中断电路产生时,中断向量由中断电路提供
中断源 具体的中断源可分为: ①外设中断:系统外部设备要求与CPU交换信息而产生的中断。 ②指令中断:为了方便用户使用系统资源或调试软件而设置的中断指令,如调用I/O设备的BIOS及DOS系统功能的中断指令和设置断点中断等。 ③程序性中断:程序员的疏忽或算法上的差错,使程序在运行过程中出现多种错误而产生的中断。
中断类型 8086采用向量型的中断结构,共有256个中断类型号,中断源按与CPU的相对位置关系分为外部中断和内部中断。 1、内部中断 也称软件中断,是由处理器检测到异常情况或执行软件中断指令所引起的一种中断。内部中断又可分为:(1)除法出错中断;(2)INTO溢出中断;(3)INT n中断;(4)断点中断;(5)单步中断。
内部中断的特点: l中断类型号由CPU自动提供的,不需要执行中断响应总线周期去读取。 l除单步中断外,所有内部中断都无法禁止,即都不能通过执行CLI指令使IF位清零来禁止对它们的响应。 l除单步中断外,任何内部中断的优先权都比外部中断高。
2、外部中断 也称硬件中断,是由CPU的外部中断请求信号触发的一种中断,分为不可屏蔽中断NMI和可屏蔽中断INTR。 (1)不可屏蔽中断NMI 它不受中断允许标志位IF的影响,即使在关中断(IF=0)的情况下,CPU也能在当前指令执行完毕后就响应NMI引脚上的中断请求。 (2)可屏蔽中断INTR CPU将根据中断允许标志位IF的状态决定是否响应。如果IF=0,CPU关中断,将拒绝响应;如果IF=1,CPU开中断,允许响应INTR引脚上的中断请求。
中断优先权 • 识别中断源的方法 (1)查询中断 查询中断就是用软件查询的方法确定中断源。 (2)向量中断 当CPU响应某个中断源的中断请求时,控制逻辑就将该中断源的中断类型号送入CPU(如NMI和INTR中断),或由程序指定中断类型号(如软件中断中的BIOS中断,DOS中断)。CPU根据中断类型号自动指向相应的中断服务程序的入口地址,转入中断服务。
中断优先权 • 2. 中断优先权的确定 • (1)软件查询排序:查询次序即优先权排序,最先被询问的故障具有最高优先级;节省硬件;修改方便,只要改变程序中的查询次序即可;由询问转至真正的服务程序入口时间长,在中断源较多的情况下执行速度较慢。 • (2)硬件排序:采用优先权的编码电路,对各种外部硬中断进行排队。有菊花链式硬件排序电路,以及中断控制集成芯片8259A
软件法排序程序 IN AL,20H ;读中断触发器的状态 TEST AL,80H ;有电源故障请求? JZ B1 ;没有,继续查询 JMP PWF ;转至电源故障程序入口 B1:TEST AL,40H ;有磁盘请求吗? JZ B2 ;无,继续查询 JMP DISS ;转至磁盘服务程序 B2:TEST AL,20H ;有磁带请求吗? JZ B3 ;无,继续查询 JMP MT ;转至磁带服务程序 B3:TEST AL,10H ;有CRT请求? JZ B4 ;无,继续查询
软件法排序程序 JMP CRT ;转至CRT显示服务程序 B4:TEST AL,08H ;有纸带请求? JZ B5 ;无,继续查询 JMP PIN ;转至纸带输入服务程序 B5:TEST AL,04H ;有纸带穿孔请求吗? JZ B6 ;无,继续查询 JMP PH ;转至纸带穿孔服务程序 B6:TEST AL,02H ;是键盘输入中断请求吗? JZ POUT ;否,转打印中断服务程序 JMP KEYIN ;转至键盘输入中断服务程序 POUT: …
中断向量、中断类型码与中断向量表 1、中断类型码(也叫中断类型号):8086可以处理256个中断请求。每个中断请求均对应于唯一固定的类型码。被0除类型码是0,单步为1; NMI为2;断点中断为3,溢出中断为4;等。
中断向量、中断类型码与中断向量表 2、中断向量:中断服务程序的入口地址,包括段地址CS (存放于高字单元)和偏移地址IP(存放于低字单元)。 (共占4个字节地址)。 3、中断向量表:存放中断向量的表格。位于内存空间的最低地址,长度1KB,可容纳256类中断向量(2564=1024)。地址范围为: 0000—03FFH。
中断向量、中断类型码与中断向量表 • 4、中断向量、中断向量号与中断向量表的关系:中断向量=中断类型号×4开始的连续4个内存单元(也就是中断服务程序入口地址)。关系见下图:
中断向量的装入(填写)与修改 • 1.中断向量的装入 中断向量并非常驻内存,而是开机上电时,由程序装入内存指定的中断向量表中。系统配置和使用的中断所对应的中断向量由系统软件负责装入。用户也可自行装入中断向量。下面介绍几种填写中断向量表的方法。 • 例1:用MOV指令。例如,假设中断类型号为60H,中断服务程序的段基址是SEG_INTR,偏移地址是OFFSET_INTR(006DH),则填写中断向量表的程序段为:
CLI ;关中断 CLD ;清DF按照内存地址加1操作 MOV AX,0 MOV ES,AX ;ES赋值为0 MOV DI,4*60H ;中断向量指针入DI MOV AX,OFFSET_INTR ;中断服务程序偏移值入AX STOSW MOV AX,SEG_INTR ;中断服务程序的段基址入AX STOSW STI ;开中断
中断向量的装入(填写)与修改 • 例2:将中断服务程序的人口地址直接写入中断向量表; MOV AX,00H MOV ES,AX MOV BX,60H*4 ;中断号*4入BX MOV AX,006DH ;中断服务程序偏移地址入AX MOV ES:[BX],AX ;装入偏移地址 PUSH CS ;假设中断服务程序和主程序在同一段 POP AX ;获取中断服务程序段基址 MOV ES:[BX+2],AX ;装入段基址
中断向量的装入(填写)与修改 • 例3:利用ORG、DW伪指令(n为中断类型号) SEGMENT AT 0000H ORG n*4 VTAB:DW OFFSET DW CSSEG ………………. 例4:利用DOS功能调用INT21 的35号和25号功能对中断向量进行修改。步骤入下:
①用35H号功能,获取原中断向量,并保存在字变量中。35H的功能调用,入口为中断类型号n入AL;出口为ES:BX,分别存放段基址和偏移。①用35H号功能,获取原中断向量,并保存在字变量中。35H的功能调用,入口为中断类型号n入AL;出口为ES:BX,分别存放段基址和偏移。 • ②用25H号功能,设置新中断向量,取代原中断向量,以便当中断发生后,转移到新中断服务程序中去。25H的入口为中断类型号入AL,段基址和偏移量入DS:DX。 • ③新中断服务程序完毕后,利用25H号功能恢复原中断向量。 • 例:假设原中断程序的中断号为n,新中断程序的入口地址的段基址为SEG_INTR,偏移地址为OFFSET_INTR。中断向量修改的程序段为:
中断向量的装入(填写)与修改 MOV AH,35H ;取原中断向量 MOV AL,n INT 21H MOV DX,ES MOV OLD_SEG,DX ;保存原中断向量 MOV OLD_OFF,BX MOV AH,25H ;设置新中断向量 MOV AL,n ;中断号入AL MOV DX,SEG_INTR MOV DS,DX ;DS指向新中断程序段址
中断向量的装入(填写)与修改 MOV DX,OFFSET_INTR ;DX指向新中断程序偏移 ;地址 INT 21H MOV AH,25H ;恢复原中断向量 MOV AL,n MOV DX,OLD_SEG MOV DS,DX MOV DX,OLD_OFF INT 21H
中断嵌套 • 什么叫中断嵌套:当CPU正在响应较低级的中断服务过程中,如果有更高级的中断申请,CPU将停止当前的中断服务程序,而转去响应高级中断,当高级中断结束后,再返回到低级中断继续服务,服务结束后再返回到断点处继续执行。
CPU执行流程 非预料事件1 中断服务程序1 中断系统的功能 1、实现中断及返回 • 中断源发出中断请求,CPU决定是否响应,若响应,则保护断点和现场,转入相应中断服务程序,中断服务结束后,恢复现场和断点,继续执行原程序。
非预料事件是指事件发生的时间无法预知,即中断源何时产生中断不确定,是随机的。非预料事件是指事件发生的时间无法预知,即中断源何时产生中断不确定,是随机的。 • 中断源产生中断的随机性,使中断服务程序的执行也具有随机性,即何时执行中断服务程序不是在程序中安排好的。 • 断点:是指CPU执行的现行程序被中断时的下一条指令的地址,又称断点地址。 • 中断现场:是指CPU转去执行中断服务程序前的运行状态,包括CPU内部各寄存器、断点地址等。
断点概念 CPU在执行此指令时, 某中断源发申请中断; CPU在执行完该指令后, 转去执行中断子程 1000:0150H 、、 、、 、、 、、 、、 MOV AX, 0 ADD AX, DX MOV [ DI ], AX 、、 、、 、、 、、 、、 PUSH AX 、、 、、 IRET 地址1000:0150H为断点
中断嵌套过程示意图 CPU执行流程 非预料事件1 中断服务程序1 中断服务程序2 非预料事件2
中断嵌套必须具备的几个条件 1)第一级中断(已处于响应状态的原中断)的服务程序中,应在保护现场执行完毕后加上开放总中断(IF位置1)的指令; 2)新到来的中断应具有比原中断高的优先级,同级或低级均不能嵌套; 3)为保护各级中断服务程序的数据不被破坏,所有服务程序中均应有保护现场、恢复现场的指令; 4)每个中断服务程序末尾必须有IRET指令以示结束,从而返回被中断的程序地址处
CPU响应外中断的条件 1.具备中断请求触发器 2.具备中断屏蔽触发器 3.开放总中断 4.在现行指令结束后响应中断
5.2 IBM-PC机中断系统 • 一、中断的分类 • 在PC机系统中,中断常分为二类: • 软(件)中断 • 硬(件)中断 • 1、硬中断: • 也称外部中断,它可分为两种: • (1)一种是由中断电路发出的中断请求信号在CPU的INTR端引起的中断,称可屏蔽中断。 • 它常常由PC机的外设或一些接口功能产生,如键盘、打印机、串行口、定时器等等。
中断的分类 • (2)另外一种是CPU的NMI端引起的中断,也称非屏蔽中断。 • 如当系统出现掉电、内存奇偶校验错误等,系统一般采用非屏蔽中断 • (3)可屏蔽中断与非屏蔽中断的区别: • 可屏蔽中断:CPU可以通过软件屏蔽掉中断,而不去执行。通过INTR引脚输入。 • 非屏蔽中断:是指CPU不能用软件指令避免对这种中断响应,必须响应由NMI端送入的中断信号。 • 2、软件中断
中断的分类 • 是指程序中使用的中断指令INT引起的中断 • 包括ROM-BIOS和DOS中断两部分。(参考书上的介绍) • 3、异常中断 • 也称内部中断,它是微机系统运行过程中CPU发现异常情况时,自动启动内部逻辑转去执行预先规定的中断号所对应的中断服务程序。是非屏蔽中断。由于中断处理过程与软中断具有相同特性,可将其规定为软中断。这类中断有:0号中断(除数为0)、1号中断(单步中断)、3号中断(断点中断)、4号中断(溢出中断)。
对CPU来说,如果这三种中断同时发生 • 则CPU将按表5.1所示的先后顺序分别执行三类中断,称为中断的优先级排队。 • 表5.1 中断优先级
X86硬中断控制逻辑性 INTR NMI
BIOS中断功能调用方法 • BIOS中断调用与DOS调用类似,即AH为功能号,给出入口参数,然后用指令“INT 中断类型码” • 如打印字符“X”,可用BIOS中断调用17H,功能号为0,入口参数为AL(待打印字符的ASCII码)、DX(打印机端口号),如: MOV AL,’X’ ;入口参数是AL、DX MOV DX,0 ;打印机号为0 MOV AH,0 ;功能调用号为0 INT 17H ;调用
中断响应与处理 • 中断类型码的获取 • NMI、断点中断、溢出中断、被0除、单步中断等类型码固定。 • INT N软中断类型码由立即数N给出。 • 外部中断读取中断类型码。 • 获得中断类型码后,如何进入中断服务程序? 1、中断类型码乘以4,得中断向量表的向量首址指针。 2、取中断向量:把向量表指针所指的4个连续字节的内容作为中断服务程序的入口地址,分别送给IP和CS。 3、按新的CS:IP指针执行中断服务程序。
0:0 、、、 、、、 0200h 3000h 、、、 、、、 、、、 MOV AX, 0 ADD AX, DX MOV [DI], AX 、、、 、、、 、、、 、、、 MOV BX,CX 、、、 、、、 IRET 、、、 0: 0000 0: N×4 中断向量表0:0 ~ 3FFH 0: N×4+2 0:03FFH 某中断源发申请中断, 申请执行类型号为N的中断子程序 堆栈 1000:0150h (IP)=0200h (CS)=3000h 执行 IRET后 响应中断后 (IP) (CS) (PSW) SS:SP 3000:200h 类型N 中断子程 响应中断前 SS:SP SS:SP 内 存 中断响应过程 0150 1000 (FLAG)
第 一 个中断响应周期 第 二 个中断响应周期 T1 T4 T1 T4 T2 T3 T2 T3 CLK INTA 向量类型 AD7~AD0 中断响应周期时序 • CPU从引脚/INTA 发中断响应信号, 接口芯片接收此信号,把中断类型号准备好; • CPU再一次从引脚/INTA 发中断响应信号,接口芯片接此信号后,将中断类型号送至数据总线上; • CPU从数据总线获取中断类型号。
标志寄存器入栈 N 令TEMP=TF 形 成 中 断 类 型 码 清IF和TF Y CS,IP入栈 软件中断? Y 执行中断处理程序 N Y 进入 中断响应 取中断 类型码 NMI? N INTR? Y IF=1? Y N N TF=1? Y IF=1? Y IP, CS 出栈 I R E T 标志寄存器出栈 N N 执行下一条指令 返回被中断 的主程序 中断处理顺序 当前指令 结束否? Y 又有NMI? N 继续执行中断程序
中断服务程序 • 保护现场:保存CPU内部各寄存器的内容,以便在服务程序中可以使用这些寄存器而不致破坏原信息。 • 开总中断:将IF置1,使得在该中断服务期间CPU仍然能够响应更高级的中断请求。 • 具体处理:进行用户的中断服务。 • 关总中断:将IF位清0。 • 恢复现场:将入栈保护的各寄存器内容依次弹出,恢复进入中断服务程序前的状态。 • 开总中断:再次将IF位置1,使返回之后能够再响应。 • 中断返回:执行一句IRET指令,CPU将自动将堆栈中的断点弹出给IP和CS,然后弹出标志寄存器FLAGS,完成恢复断点的操作。这样,程序就可以接着执行被中断的原程序了。