1.中断源
8086的中断源分为内部中断和外部中断两种。内部中断也称为软件中断,它是由中断指令INT n产生的中断,它不能被IF标志位所屏蔽。外部中断又称为硬件中断,其中断源是由CPU外部的某种事件产生的,分为不可屏蔽中断NMI和可屏蔽中断INTR。
INTR是可屏蔽中断请求输入信号,该信号可用IF标志位屏蔽。若IF=0,该信号被屏蔽,CPU不理睬INTR的请求;若IF=1,CPU则响应INTR的请求。所以可用指令STI使IF置1,允许INTR请求,也可用指令CLI使IF为0,以屏蔽INTR请求。通过中断控制器8259A可将多个外部中断请求接到CPU。
NMI是不可屏蔽中断请求输入信号。与INTR不同,NMI请求的响应不受IF标志位的影响。NMI通常用于处理一些比INTR请求更紧迫的情况,它的优先级比INTR高。
8086中断源的优先级顺序从高到低为INT n(除单步中断)、NMI、INTR、INT 1。
2.中断响应过程
软件中断由程序设定,它不受IF标志位的影响,中断向量(类型)号由指令INT n中的n决定。CPU在执行软件中断时,没有中断响应周期。CPU根据指令中的类型号n就能转入相应的处理程序入口。所以用INT n指令可以模拟任何中断源,也可以调用256个入口的任何一个中断处理程序。它把中断的随机事件变成了执行INT n指令的必然事件,可使中断处理程序和一般子程序一样容易调试。
对NMI请求,不必判断IF标志位,也不用外设接口给出中断向量号,CPU响应时不发送中断响应周期,CPU自动生成其类型号2,然后转入相对应的处理程序入口。
对INTR请求,CPU响应时要比上述两种中断情况复杂一些。CPU响应中断后,对外设接口(实际上是对中断控制器)发出两个中断响应周期INTA。中断响应时序图请参看本书对应的教材《微机原理与接口技术(第3版)》。
在第一个中断响应周期,CPU将地址/数据总线置于浮动状态,发出 信号给8259A,表示CPU响应此中断请求,并禁止其他中断请求,以保证中断响应的完整性。
在第二个周期,8259A把请求中断的中断源的中断向量号通过数据总线D7~D0送给CPU,CPU可由此获得该中断源的处理程序的入口地址。
无论哪一种中断,CPU在响应中断时,最重要的是要得到中断类型号。之后,应完成如下操作:
·把标志寄存器FR的内容压入堆栈;
·将TF值保存到TEMP,然后使IF=0,TF=0,即屏蔽INTR中断和单步中断;
·保存断点,即将断点处CS和IP的内容压入堆栈;
·根据中断类型号,查中断向量表,把入口地址值装入CS和IP中,然后转入中断处理程序。(www.daowen.com)
当中断处理程序结束后,应执行IRET指令,该指令将从堆栈弹出3个字,即FR的内容(一个字)和断点地址(两个字)。由于在中断响应过程中,CPU只保护了FR和断点地址,所以,在中断服务程序中要用到的寄存器,用户在使用之前应在服务程序中予以保护,在中断返回IRET前应予以恢复,使CPU的现场与中断前完全一样。
3.中断向量表与中断类型号
中断向量表又称为中断服务程序入口地址表。8086系统允许处理256种类型的中断,对应的类型号为00H~FFH(0~255)。每个类型号占用4字节的内存单元,所以共占用1 024字节的内存空间。中断向量表规定在内存的地址最低端1 KB空间,即内存地址00000H~003FFH中,4个地址空间的高地址单元存放入口地址的段地址,低地址单元存放入口地址的段内偏移量。
各个中断处理程序的段地址与偏移量按中断类型号顺序存入中断向量表中。知道了中断类型号就可找到中断向量地址,由中断类型号n×4即可得到相应的中断向量的地址,从地址4n开始的连续4个内存单元的内容就是该类型号的中断服务程序的入口地址。取4n和4n+1单元内容装入指令指针寄存器IP中,取4n+2和4n+3单元内容装入代码段寄存器CS中,即可转入中断服务程序。
系统对256种中断类型号进行了分配,其中类型号0~4为专用中断,中断入口地址已由系统定义,用户不能修改。类型号0~4分别用于除法出错、单步中断、NMI中断、断点中断和溢出中断。
类型号05H~3FH为系统使用中断。已开发使用了大部分类型号,例如,类型号08H~0FH为8259A中断类型号,10H~1FH为BIOS专用中断类型号,20H~3FH为DOS专用中断类型号,其中类型号21H为DOS功能调用。
4.中断服务程序结构
中断服务程序根据中断源的需要来编制,其功能可以各不相同,但其程序结构基本相同。
·程序开始必须保护中断时的现场,中断服务程序用到的寄存器可以用PUSH指令将它们压入堆栈保护。
·若允许中断嵌套,则用STI指令来设置开中断,使IF=1。
·编写中断处理程序。
·用CLI指令关中断,使IF=0,禁止返回前其他中断请求进入。
·给中断控制器送中断结束命令EOI,使当前正在处理的在服务标志位IS清零,以解除对同级或低级中断请求的屏蔽。
·恢复现场,用一系列POP指令将保护的寄存器恢复。
·用IRET指令返回主程序,CPU会自动恢复断点地址和FR内容。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。