第七章微型计算机中断系统7-1概述一、中断概念当CPU正常运行程序时,由于微处理器内部事件或外设请求,引起CPU中断正在运行的程序,转去执行请求中断的外设(或内部事件)的中断服务子程序,中断服务程序执行完毕后,再返回被中止的程序,这一过程称为中断。1.中断源引起程序中断的事件称为中断源。中断源有外部中断和内部中断,内部中断由程序预先安排的中断指令(INTn)引起,或由于CPU运算中产生的某些错误(如除法出错、运算溢出)引起。外部中断是外部设备或协处理器向CPU发出中断申请引起的。2.中断响应中断请求何时发生是随机的。CPU在每条指令的最后一个T周期去检测INTR引脚,CPU一旦检测到有中断请求,在满足中断响应的条件下(IF=1),CPU响应中断,会向外设发出中断响应信号。并保护断点(当前CS、IP和PSW值入栈),然后转向中断服务程序。中断服务程序执行完毕,CPU返回原执行程序的中断处,继续向下执行,称为中断返回。3.中断向量表CPU响应中断后,必须由中断源提供地址信息,引导程序进入中断服务子程序,这些中断服务子程序的入口地址存放在中断向量表中。内存中专门开辟了一个区域,存放中断向量表(也称中断矢量表)。4.中断优先级当有多个中断源请求中断时,中断系统判别中断申请的优先级,CPU响应优先级高的中断,挂起优先级低的中断。当CPU在运行中中断服务子程序时,又有新的更高优先级的中断申请进入,CPU要挂起原中断进入更高级的中断服务子程序,实现中断嵌套功能。5.中断屏蔽当中断源申请中断时,CPU可以由软件设置,使之不能响应,称为中断屏蔽。二、中断分类8086/8088有一个强有力的中断系统,可以处理256种不同的中断。8086/8088系统上的中断源如图7-1所示。单步(TF=1)INTO指令除法出错INTn指令中断逻辑非屏蔽中断请求8086/8088CPU8259A可屏蔽中断请求INTRNMI图7-18086/8088中断源以产生中断的方法来分类,256种中断可以分为两大类:外部中断和内部中断。外部中断也称为硬件中断,是由外部的硬件产生的,硬件中断又分成不可屏蔽中断和可屏蔽中断。下面分别加以说明。1.外部中断8086/8088CPU有两个外部中断请求线:不可屏蔽中断请求线NMI和可屏蔽中断请求线INTR。(1)由NMI引脚引入的不可屏蔽中断请求,采用边沿触发,上升沿之后维持两个时钟周期高电平有效。对于不可屏蔽中断用户是不能用软件来屏蔽的,一旦有不可屏蔽中断请求,CPU必须予以响应。不可屏蔽中断请求的中断类型号为2,即中断处理程序的入口地址在0段的0008H~000BH的4个单元中。(2)由INTR引脚引入的外设提出的可屏蔽中断请求,采用电平触发,高电平有效,INTR信号的高电平必须维持到CPU响应中断才结束。可屏蔽中断是用户可以通过软件设置来屏蔽的外部中断,即使外部设备有中断请求,CPU可以不予响应。由外设引起的可屏蔽中断请求要得到响应应有两个条件:①外设中断请求是否被屏蔽;②CPU是否允许响应中断。在8086CPU系统中,外设的中断请求信号接入可编程中断控制器8259A的IRi端,而8259A的中断输出INT连到CPU的INTR引脚上。8259A中设有中断屏蔽寄存器,它的8位对应控制8个外设,通过设置这个寄存器的某位为0或1,可以允许或禁止某个外设的中断请求。一块8259A可管理8个中断,当外设超过8个时,可以使用多个8259A进行级联,扩大到64级中断。外设与8259A的连接是由用户来设计的,硬件连线决定了中断类型号和中断优先级次序。CPU是否允许响应中断,与中断允许位IF有关。IF=1,CPU允许响应中断;IF=0,CPU禁止响应中断。2.内部中断内部中断又称为软件中断。软件中断通常有三种情况引起:①由中断指令INT引起的中断;②由CPU的某些运算错误引起的中断;③由调试程序debug设置的中断。※内部中断只要由上面三种情况引起了,是不可屏蔽的!(1)由中断指令INT引起的中断CPU执行一条INTn指令后立即产生中断,并且调用系统中相应的中断处理程序去完成中断功能,指令中的n指出了中断类型号。例7-1测试存储器容量INT12HCPU执行这条指令时,立即产生一个中断。并从中断向量表的0:12H×4开始的单元中取出4个字节,其内容为中断服务子程序的段地址和偏移地址,然后转去此入口去执行中断服务子程序,完成对存储器的测试。(2)由CPU的某些运算错误引起的中断CPU在运行程序时,会发现一些运算中出现的错误,此时CPU就会中断,让用户去处理这些错误。主要有:①除法错中断:除法错中断类型号为0,在除法运算中,若除数为0或商超过了寄存器所能表达的范围,就产生一个类型号为0的中断,转去类型号为0的中断处理。②溢出中断:溢出中断类型号为4,专用指令为INTO。若OF=1执行中断指令INTO;若OF=0,不执行中断指令。通常INTO放在加、减法运算指令的后面。例7-2测试加法的溢出ADDAX,BXINTO(3)由调试程序debug设置的中断在调试程序时,为了检查中间结果或寻找程序中的错误,在程序中可设置断点或进行单步跟踪,调试程序debug有此功能它也是由中断来实现的。①单步中断:单步是每次只执行一条指令,然后屏幕显示当前各寄存器和有关存储单元的内容,以及下条要执行的指令。这样逐条运行指令,来跟踪程序的流程,以检查出程序中的错误。单步中断是在标志位TF=1时,每条指令执行后,CPU自动产生中断类型号为1的中断。②断点中断:中断类型号为3。用debug调试程序时,可用G命令设置断点。当CPU执行到断点时便产生中断,同时显示当前各寄存器和有关存储单元的内容,以及下条要执行的指令,供用户检查。设置断点实际上是把一条断点指令INT3插入到断点设置处。7-2中断处理过程可屏蔽中断处理的过程一般分成几步:中断请求;中断响应;保护现场;转入中断服务子程序;恢复现场和中断返回。其流程如图7-2所示。执行指令取下一条指令关中断保护现场响应中断保护断点寻找中断源转中断服务程序恢复现场返回有中断请求?指令结束?中断服务YNYN图7-2可屏蔽中断处理流程图一、CPU响应中断过程CPU响应中断要有三个条件:●外设提出中断申请●本中断位未被屏蔽●中断允许当中断接口电路中的中断屏蔽触发器未被屏蔽时,外设可通过中断接口发出中断申请。外设向CPU发出中断请求的时间是随机的,而CPU在每条指令的最后一个机器周期的最后一个T状态去采样中断请求输入线INTR,当CPU在INTR引脚上接收到一个有效的中断请求信号,而CPU内部的中断允许触发器是开放的,则在当前指令执行完后CPU响应中断。CPU响应中断后,对外设接口发出两个中断响应信号,第一个信号通知外设,CPU已响应申请的中断请求,准备发送中断类型号;当外设收到第二个以后,立即往数据线上给CPU送中断类型号。CPU在响应外部中断,并转入相应中断服务子程序的过程中,自动依次做以下工作:INTAINTAINTA(1)从数据总线上读取中断类型号,将其存入内部暂存器。(2)将标志寄存器PSW的值入栈。(3)将PSW中的中断允许标志IF和单步标志TF清0,以屏蔽外部其它中断请求,和避免CPU以单步方式执行中断处理子程序。(4)保护断点,将当前指令下面一条指令的段地址CS和指令指针IP的值入栈,使中断处理完毕后,能正确返回到主程序继续执行。(5)根据中断类型号到中断向量表中找到中断向量,转入相应中断服务子程序。(6)中断处理程序结束后,从堆栈中依次弹出IP、CS和PSW,然后返回主程序断点处,继续执行原来的程序。对于不可屏蔽中断请求,不必判断IF是否为1,也不是由外设接口给出中断类型号,从NMI引脚进入的中断请求规定其中断类型号为2。在运行中断子程序过程中,若NMI引脚上有不可屏蔽中断请求信号,CPU仍能响应。软件中断由程序设定,没有随机性,它不受中断允许标志位IF的影响,中断类型号由指令INTn中的n决定。正在执行软件中断时,如果有不可屏蔽中断请求,就会在当前指令执行完后立即予以响应。如果有可屏蔽中断请求,并且IF=1,也会在当前指令执行完后予以响应。二、中断向量表寻找中断源可以用查询中断及矢量中断两种方法。查询中断是采用软件查询方法,中断响应后启动中断查询程序,依次查询哪个设备的中断请求触发器为1,检测到后,转向此设备预先设置的中断服务程序入口地址。此方法较简单,但花费时间多,并且后面的设备服务机会少,在8086系统中一般采用矢量中断方法。矢量中断是将每个设备的中断服务程序的入口地址(矢量地址)集中,依次放在中断向量表中。当CPU响应中断后,控制逻辑根据外设提供的中断类型号查找中断向量表,然后将中断服务程序的入口地址送到CS段寄存器和指令指针IP,CPU转入中断服务子程序。这样大大加快了中断处理的速度。1.中断向量表中断向量表又称中断服务程序入口地址表。8086/8088系统允许处理256种类型的中断,对应的中断类型号为0~FFH在存储器的00000H~003FFH,占用1K字节空间,用作存放中断向量。每个类型号占4个字节,高2个字节存放中断入口地址的段地址,低2个字节存放段内偏移地址,如图7-4所示。类型0中断入口(除法出错)类型1中断入口(单步中断)类型2中断入口(NMI)类型3中断入口(断点中断)类型4中断入口(溢出中断)类型5中断入口类型255中断入口类型32中断入口类型31中断入口┋┋0:00000:00040:00080:000C0:00100:00140:007C0:00800:03FCIPCSIPCSIPCS专用中断(5个)系统使用(27个)供用户使用(224个)图7-48086/8088中断向量表各个中断处理程序的段地址和偏移地址按中断类型号顺序存放在中断向量表中。因此由中断类型号n×4即可得到相应中断向量的地址,取4n和4n+1单元中的内容(中断入口程序偏移地址)装入指令指针IP,取4n+2和4n+3单元中的内容(中断入口程序段地址)装入代码段寄存器CS,即可转入中断处理服务子程序。例7-3某中断的中断类型号为68H,图7-5图示了中断操作过程:(1)取中断类型号68H;(2)计算中断向量地址68H×4=1A0H;(3)取中断入口地址的偏移地址送入IP,IP=2050H,段地址送入CS,CS=A000H;(4)转向中断服务程序;(5)中断返回到INT68H指令的下一条指令。类型67H中断向量类型69H中断向量502000A00:19C0:1A00:1A20:1A42050A000IPCSSTIPUSHDS┋IRETINT68HMOVAX,0向量地址=68H×4=1A0H中断处理程序A000:2050H①②③④⑤图7-5中断操作过程例子2.中断向量(中断入口地址)的设置IBMPC对256种中断类型已进行了地址分配,附录D中给出了中断向量地址分配表。其中类型0~4为专用中断,中断入口地址已由系统定义,用户不能修改;类型5~类型31为系统使用中断,也不允许用户修改;其余的中断类型号原则上可以由用户定义,但实际上,有些中断类型目前已有用途,例INT21H为系统功能调用,中断类型20H~3FH为DOS中断调用。供用户使用的中断类型号,它可以由用户定义为软中断,由INTn指令引用;也可以通过INTR端直接接入,或通过中断控制器8259A引入可屏蔽硬件中断。使用时用户要自己将中断服务程序入口地址置入相应的中断向量表中。有两种方法可为中断类型号n设置中断向量,即将中断服务程序的入口地址置入中断类型号n所对应的中断向量表中。一种方法用指令来设置,另一种方法利用DOS功能调用来设置。例7-5用指令来设置中断服务程序的入口地址到中断类型号n所对应的中断向量表中。MOVAX,0MOVES,AXMOVBX,N*4MOVAX,OFFSETINTRAD;置入偏移地址MOVES:WORDPTR[BX],AXMOVAX,SEGINTRAD;置入段地址MOVES:WORDPTR[BX+2],AXSTI┋INTRAD:;类型号n的中断服务子程序