2020年3月2日12020年3月2日12020年3月2日12020年3月2日12020年3月2日12020年3月2日1第14章x86PC的中断系统20:331DECHEXBIN140E00001110汇编语言与接口技术2020年3月2日2第14章x86PC的中断系统学习本章后:1、明确中断的概念2、会处理中断3、会管理和应用中断服务程序4、会编写中断应用程序第14章x86PC的中断系统本章的主要内容:14.18088/86中断14.1.1中断源14.1.2中断服务程序14.2x86PC及中断分配14.3中断应用程序2020年3月2日314.18088/86中断中断概述中断:产生了一种外部事件,通知CPU有设备需要服务。{计算机在执行正常程序的过程中,当出现异常事件或事先安排好的事件,迫使CPU暂时中止现行程序的执行,转去执行另一处理程序。当处理完后,CPU再返回到被暂时中止的程序,接着执行被暂时中止的程序。此过程称为中断。}类型:8088/86中共有256中类型的中断:INT0,INT1,…,INTFF。0,1,…,FF,为中断向量号或者中断类型码。保护:处理中断前保护有关寄存器到固定的内存单元:FR,IP,CS中断服务程序入口:(中断向量号*4)IP(中断向量号*4+2)CS2020年3月2日514.18088/86中断例如:中断向量表(右表)INT0:0号中断除法错INT1:1号中断单步INT2:2号中断NMI14.18088/86中断14.1.1中断源中断源:引起中断的事件。例如:外设输入/输出请求,计算机异常事故或其他内部原因。14.18088/86中断14.1.1中断源(续)中断分类按照引起中断的方式,中断可分为:①硬件中断(或外中断):外设控制器或协处理器引起的中断②软件中断或内中断:程序中的中断指令INT或CPU错误结果产生的中断14.1.1中断源(续)硬件中断由外部硬件产生,也称外部中断硬件中断分两类:非屏蔽中断(NMI:NonMaskableInterrupt)通过8086/8088的NMI脚引入,它不受中断允许标志IF的屏蔽;中断类型号=2可屏蔽中断(MaskableInterrupt)可屏蔽中断通过CPU的INTR脚引入,只有当标志寄存器的中断屏蔽标志IF为1时,才能引起中断开中断指令:STI,设置中断允许位(IF=1)关中断指令:CLI,清除中断允许位(IF=0)14.18088/86中断14.1.1中断源(续)中断数目的扩展:8259可编程中断控制器x86用于中断的引脚INTR,INTA;Intel提供了8259可编程中断控制器芯片,使得扩展中断数目的工作变得很容易。14.18088/86中断2020年3月2日1014.18088/86中断不受中断标志位IF屏蔽:1)非屏蔽中断(NMI):电源错、内存和总线奇偶等异常,中断类型号=22)程序中INT指令、运算结果异常等受中断标志位IF屏蔽:可屏蔽的外部设备中断请求(INTR)0n8259A可编程中断控制器中断逻辑INTR2NMI41CPU不可屏蔽中断请求INTnINTO除法错单步IR0IR1IR3IR4IR5IR6IR7IR2系统定时器(08)键盘(09)彩色/图形接口(0A)串行通讯口2(0B)串行通讯口1(0C)硬盘(并行口)(0D)软盘(0E)打印机(0F)8259A中断级联一片8259A管理8级中断,当申请中断的外设多于8级时可以将8259A级联使用,第一级为8259A主片,第二级为8259A从片,主片可接1~8片8259A从片,这样最多可管理64级中断源。8259A中与中断相关寄存器中断屏蔽寄存器(IMR)中断命令寄存器14.18088/86中断8259A的中断屏蔽寄存器(IMR)IMR的I/O端口地址21H8位对应8个外部设备,允许/禁止某设备产生中断=0时,允许产生中断=1时,禁止产生中断例:只允许键盘中断,设置中断屏蔽字MOVAL,11111101BOUT21H,AL例:新增设允许键盘中断,设置中断屏蔽字INAL,21HANDAL,11111101BOUT21H,ALCPU可以响应某设备的中断服务请求的条件中断屏蔽寄存器中对应位=0,同时IF=1打印机软盘硬盘定时器彩显COM2COM1键盘76502341中断命令寄存器I/O端口地址20H8位含义L2-l0:指定IR0-IR7中哪个中断优先级最低R(rotate),SL(setlevel)控制IR0-IR7中断优先顺序EOI:中断结束,当EOI=1时,将当前中断请求被清除中断服务程序中,中断处理结束前,应将EOI置1结束硬件中断指令INAL,20HORAL,20HOUT20H,ALRSLEOIL0L200L176502341②软件中断②软件中断软件中断也称内部中断,由3种情况引起1.程序中的中断指令INTn操作数n指出中断类型号,0—FFH如INT12H;存储器容量测试2.CPU的某些运行结果除法错中断:除数为零/商超出表数范围,中断类型号为0的内部中断溢出中断:运算结果溢出,OF=1,INTO指令将引起类型为4的内部中断3.调试程序(DEBUG)设置的中断单步中断:标志位TF=1时,中断类型号=1断点中断:将程序分段,每段设置一个断点(INT3),中断类型号=3软件中断不受中断屏蔽标志IF影响14.18088/86中断14.1.2中断服务程序每个中断都有一个相关的程序。发生中断时,要执行该程序完成特定的任务,这个程序称为中断服务程序。中断发生时,CPU自动执行中断服务程序。如何找到中断服务程序?14.1.2中断服务程序x86有256种类型的中断每种中断有一个中断类型号,类型号0-FFH每种类型中断都由相应的中断处理程序处理中断向量表各类型中断处理程序的入口地址表在存储器中,1KB(00000H-003FFH)每类型中断向量占4字节,对应中断处理程序入口CS、IP值每类中断向量表地址=4×中断类型号n类型0中断处理程序入口地址IPCS00000H类型1中断处理程序入口地址IPCS00004H类型2中断处理程序入口地址IPCS00008H类型0中断处理程序入口地址IPCS003FCH类型3中断处理程序入口地址IPCS0000CH003FFH……除法错单步NMI断点INTn中断向量表2020年3月2日18第14章x86PC的中断系统14.18088/86中断14.1.1中断源14.1.2中断服务程序14.2x86PC及中断分配14.3中断应用程序2020年3月2日1814.2x86PC及其中断分配在x86的256种可能的中断中,有些用于PC外设硬件BIOS,有些被操作系统使用,剩下的由软件编程人员使用。14.2x86PC及其中断分配2020年3月2日20中断向量地址表-表示法1--2中断向量地址一览表分类中断类型码地址(0000H段)功能系统内中断(BIOS)00000H~0003H被零除10004H~0007H单步20008H~000BH不可屏蔽3000CH~000FH断点40010H~0013H溢出50014H~0017H打印屏幕60018H~001BH保留7001CH~001FH保留分类中断类型码地址(0000H段)功能系统8级外中断(BIOS)80020H~0023H日时钟90024H~0027H键盘A0028H~002BH保留B002CH~002FH异步通信(2)C0030H~0033H异步通信(1)D0034H~0037H硬盘E0038H~003BH软盘F003CH~003FH打印机分类中断类型码地址(0000H段)功能设备驱动(BIOS)100040H~0043H显示110044H~0047H设备配制120048H~004BH存储容量13004CH~004FH硬盘I/O140050H~0053H通信I/O150054H~0057H盒式磁带I/O160058H~005BH键盘I/O17005CH~005FH打印机I/O180060H~0063HROMBASIC190064H~0067H系统自举1A0068H~006BH日时钟I/O1B006CH~006FH键盘中断地址1C0070H~0073H定时器报时1D0074H~0077H显示器参数1E0078H~007BH软盘参数1F007CH~007FH图形字符扩展分类中断类型码地址(0000H段)功能DOS20~2F0080H~00BFHDOS调用30~3F00C0H~00FFH为DOS保留这些功能可以用中断方式调用INTn存取中断向量的DOS功能调用(21H)设置中断向量预置:AH=25HAL=中断类型号DS:DX=中断向量(中断程序入口地址)执行:INT21H取中断向量预置:AH=35HAL=中断类型号执行:INT21H返回:ES:BX=中断向量(中断程序入口地址)*如何读取/改变中断向量表中的中断程序入口地址(中断向量)例8.4使用DOS功能调用存取中断向量…MOVAL,NMOVAH,35HINT21HPUSHESPUSHBXPUSHDSMOVAX,SEGINTHANDMOVDS,AXMOVDX,OFFSETINTHANDMOVAL,NMOVAH,25HINT21HPOPDS……POPDXPOPDSMOVAL,NMOVAH,25HINT21HRET用户自定义中断程序INHAND:……IRET保存原中断向量设置新中断向量恢复原中断向量取中断向量预置:AH=35HAL=中断类型号执行:INT21H返回:ES:BX=中断向量设置中断向量预置:AH=25HAL=中断类型号DS:DX=中断向量执行:INT21H2020年3月2日25第14章x86PC的中断系统14.18088/86中断14.1.1中断源14.1.2中断服务程序14.2x86PC及中断分配14.3中断应用程序2020年3月2日2514.3中断应用程序本节通过举例说明中断应用程序的编写方法。例子1.用户自定中断程序设计方法例子2.利用系统提供的中断的中断程序设计方法14.3中断应用程序例1.用户自定义中断完成AL中的数据显示,中断类型号78H(保留);主程序中设置中断向量MOVAX,segint78MOVDS,AXMOVDX,offsetint78MOVAH,25HMOVAL,78HINT21H;中断处理程序int78:………;中断服务功能处理;显示AL中的高四位;显示AL中的低四位IRET参看INTEXP.ASM14.3中断应用程序例2要求每10秒响铃一次,并显示“Thebellisring!”要点:如何设计中断处理程序;如何进入中断处理程序系统定时器中断处理程序INT1CHIRETIRETBIOS中可用资源:系统定时器(中断类型8,每秒中断18.2次)系统定时器的中断处理程序中,有一条指令INT1CH,但嵌套调用后BIOS中只有IRET指令。用户可实现完成某些周期性工作,但影响系统时钟系统定时器中断处理程序INT1CHIRETIRETBIOS中系统定时器中断处理程序INT1CHIRETIRET我们的中断程序设计中断处理程序系统定时器中断10*18.2=182=B6H次,响铃一次,并显示“Thebellisring!”系统定时器中断中读时钟,如果到10秒,响铃一次,并显示“Thebellisring!”如何进入中断处理程序改变INT1CH的中断向量,使系统定时器中的嵌套中断指向我们设计的中断处理程序将我们设计的中断处理程序放在INT1CH嵌套调用的BIOS处替换掉IRET指令。BIOS是固件,不可行在INT1CH嵌套调用的BIOS中将IRET指令替换为跳转指令,指向我们设计的中断处理程序。要修改编译内核中断类型1CH作为用户使用的中断类型,可能已被其他功能的程序使用,所以在编写新的临时中断程序时,应做如下工作:1、在主程序的初始化部分,先保存当前1CH的中断向量,再设置新的中断向量。2、在主程序结束部分恢复保存的1CH中断向量。类型0中断处理程