8086用8位二进制表示一个中断类型,因此可以有256个不同的中断。这些中断又可以划分为内部中断、不可屏蔽中断、可屏蔽中断3类,如图6-5所示。
图6-5 8086中断结构
8086有两根外部中断请求输入引脚,不可屏蔽中断请求信号通过NMI引脚输入,可屏蔽中断请求信号通过INTR引脚输入。所有的可屏蔽中断源共用一条INTR线,由可编程的中断控制器Intel 8259A统一管理。
8086 CPU规定了各类中断的优先级,最高级为除法出错中断INT 0,然后依次是溢出中断INTO、INT n指令、不可屏蔽中断NMI、可屏蔽中断INTR,单步中断的优先级最低。
内部中断是由于执行INT n、INTO等指令,或是由于除法出错,或是进行单步操作而引起的中断。8086 CPU的内部中断有5种类型。
(1)除法出错中断。
在执行DIV(无符号数除法)或IDIV(有符号数除法)指令时,若发现除数为0或商超过寄存器所能表达的范围,8086 CPU立即执行中断类型为0的内部中断。
(2)单步中断。
8086标志寄存器中有一个自陷标志位TF,若TF=1,则CPU每执行完一条指令就引起一个中断类型为1的内部中断。它用于实现单步操作,是一种强有力的调试手段。
(3)断点中断。
指令INT 3产生一个中断类型为3的内部中断,称为断点中断。在程序调试过程中需要跟踪程序走向、了解程序执行过程的中间结果时,可以用INT 3指令临时替换原有的指令,称为设置断点。程序执行到断点处,会因执行INT 3指令进入类型3的中断服务程序,于是,原程序被暂停执行。此时可以读出程序的执行环境(指令地址、寄存器值、变量值等),供程序员调试使用。最后恢复原来的指令,继续执行被调试的程序。
(4)INTO指令。
8086标志寄存器中有一个溢出标志位OF,若前面指令的执行结果使OF=1,则INTO指令引起中断类型码为4的内部中断;否则此指令不起作用,程序顺序执行下一条指令。
(5)INT n指令。
用户可以用INT n指令产生一个中断,n为中断类型码。
外部中断分为可屏蔽中断和不可屏蔽中断。
INTR上引入的可屏蔽中断受标志寄存器中的中断允许标志位IF控制。IF=0时,CPU不响应INTR的中断请求,IF=1时,CPU响应INTR的中断请求。可以用STI指令使IF=1,称为开中断;用CLI指令使IF=0,称为关中断。
系统复位后,或CPU响应了任何一种中断(内部中断、NMI、INTR)后,都会使IF=0。因此,一般情况下应使用STI指令使IF=1,确保中断开放。
8086的可屏蔽中断源由8259A统一管理,每片8259A可以接受8个外部设备的中断请求。外部设备将中断请求信号送到8259A的输入端,8259A根据屏蔽状态决定是否给8086的INTR端发出信号。8086响应中断请求后给8259A发出信号,8259A利用此信号将中断优先级别最高的中断类型码送给8086。INTR中断的类型码可以是5~255。
NMI接收上升沿触发的中断请求信号,只要输入脉冲有效宽度(高电平有效时间)大于两个时钟周期就能被8086锁存。CPU对NMI中断请求的响应不受中断允许标志位IF控制。不管IF的状态如何,只要NMI信号有效,8086现行指令执行结束,没有DMA请求都会立即响应NMI中断请求。NMI中断类型码固定为2。
8088的中断系统能够处理256个不同的中断源,每个中断源都有一个为它服务的中断处理子程序。CPU响应中断后转入中断服务子程序。那么,CPU是如何转入中断服务子程序?其入口地址如何找到?下面将逐一介绍。首先介绍几个概念。
(1)中断类型号:为每个中断源指定的一个8位的编号,以识别不同的中断源,这8位的编号称为中断类型号。
(2)中断向量:每一个中断服务程序的入口地址称为中断向量。
(3)中断向量表:把系统中所有的中断向量集中起来,根据中断类型号从小到大的顺序存放到存储器的某一个区域内,这个存放中断向量的存储区称为中断向量表。在实模式下,中断向量表位于内存的第一个1KB空间。
8088 CPU以存储器的00000H~003FFH共1024个单元作为中断向量的存储区,每个中断向量占用4个存储单元。4个单元中的前两个单元存放中断服务程序的偏移地址,后两个单元存放中断服务程序的段地址。当CPU响应中断时,16位的段内偏移量装入IP,16位的段地址装入CS,从而使CPU转入中断服务程序的执行。
CPU响应中断后,如何从中断向量表中找到该中断服务程序的中断向量呢?它是通过中断类型号×4得到中断向量CS和IP在中断向量表中的首地址。中断类型号和中断向量所在的位置关系如表6-1所示。
表6-1 8088中断向量表
中断类型号 |
内 容 |
地 址 |
中断名称 |
0 |
类型0的(IP) |
00000H |
除法出错 |
类型0的(CS) | |||
1 |
类型1的(IP) |
00004H |
单步跟踪 |
类型1的(CS) | |||
2 |
类型2的(IP) |
00008H |
不可屏蔽中断 |
类型2的(CS) | |||
3 |
类型3的(IP) |
0000CH |
断点中断 |
类型3的(CS) | |||
4 |
类型4的(IP) |
00010H |
溢出中断 |
类型4的(CS) | |||
5 |
类型5的(IP) |
000014H |
|
类型5的(CS) | |||
|
|
|
|
N |
类型N的(IP) |
4×NH |
INT指令中断和可屏蔽中断 |
类型N的(CS) | |||
|
|
|
|
255 |
类型255的(IP) |
003FCH |
|
类型255的(CS) |
003FEH |
其中,类型号0~4系统已经占用,不允许用户进行任何修改。类型号05H~3FH是系统备用中断,这是Intel公司为软硬件开发保留的中断类型号,一般也是不允许用户改进行其他用途。类型号40H~FFH可供用户使用。