7.3.1 中断的概念

7.3.1 中断的概念

1.中断的定义和功能

中断是计算机系统中一个非常重要的概念。中断技术在微机系统中的应用,不仅可以实现CPU 与I/O 设备并行工作,而且可以及时处理系统内部和外部的随机事件,使系统能够更加有效地发挥作用。Intel 80x86系列微机的中断系统包括:CPU 中断管理机制、中断控制器8259A 和中断处理程序,它最多可以管理256种类型的中断,能够自动实现中断源识别、中断源优先权判优和中断屏蔽等功能。

所谓中断,是指CPU 在执行程序的过程中,由于某种系统外部或内部事件的发生(如I/O 设备请求向CPU 传送数据或CPU 执行程序出现了异常),CPU 暂停当前正在执行的程序,转去为该事件服务,待为该事件服务结束后,能自动地返回被中断的程序中继续执行的过程。

中断过程可以用图7.7来描述,当CPU 正在执行主程序M 时,某个事件(内部或外部)发生并请求CPU 处理,当CPU 响应中断请求后,保存当前状态,中断正在执行的程序M 而转去为该事件服务,执行中断服务程序S;当中断服务程序S执行结束后,CPU 又自动地返回到原来被中断的主程序M 中继续执行。这里将能实现中断过程的技术,称为中断技术。

图7.7 中断过程

采用查询控制方式时,CPU 必须不断地查询I/O 设备的忙/闲状态,与I/O 设备交换数据时效率很低,为提高CPU 的利用率,人们提出了中断的概念。采用中断技术后,CPU 平时可以执行主程序,只有当I/O 设备将数据准备好了,或者输出缓冲器空了,才向CPU 提出中断请求。CPU 响应中断后暂停当前程序的执行,转去为I/O 设备服务,服务完后又返回断点处,继续执行原来的程序。这样,CPU 就省掉了查询I/O 设备的时间,从而大大提高了CPU 的利用率。

2.中断源和中断分类

在计算机系统中,引起中断的原因或能发出中断请求的外设称为中断源。8086/8088系列微机系统有两种中断源,一种称为硬件中断源或外部中断源,它们从CPU 的不可屏蔽中断引脚NMI和可屏蔽中断引脚INTR 引入;另一种称为软件中断源或内部中断源,是为解决CPU 运行过程中出现的一些意外事件或便于程序调试而设置的。因此,根据不同的中断源,可以把8086/8088系列微机的中断分为硬件中断和软件中断两大类。8086/8088系列微机的中断分类和中断源如图7.8所示。

图7.8 8086/8088系列的中断分类和中断源

(1)硬件中断(外部中断)

从NMI和INTR 引脚引入的中断属于硬件中断(外部中断)。其中,从NMI引脚引入的中断称为非可屏蔽中断。非可屏蔽中断用来应对比较紧急的情况,如断电、存储器或I/O校验错、协处理器异常中断请求等,它不受中断标志IF的影响,CPU 必须马上响应和处理。非可屏蔽中断通常采用边沿脉冲触发,当8086/8088处理器的NMI引脚上接收到由低到高的电平变化时,将自动产生中断类型码为2的非可屏蔽中断。

从8086/8088处理器的INTR 引脚引入的中断请求称为可屏蔽中断。只有当CPU 的标志寄存器FLAGS的中断标志位IF=1时,才允许响应此引脚引入的中断请求;若IF=0,即使外部有中断请求,也不能响应中断。在8086/8088系列微机中,这类中断是通过8259A可编程中断控制器的输出引脚INT,连到CPU 的INTR 引脚上去的。中断控制器8259A的输入引脚IR0~IR7可引入8路中断,允许有时钟、键盘、串行通信口COM1和COM2、硬盘、软盘、打印机7个中断源,IR2为用户保留。经中断控制器8259A 判别后,选择中断优先级最高的设备向CPU 提出中断请求。CPU 执行当前指令,当运行到最后一个指令周期时,对INTR 线采样,若发现有中断请求信号,则将内部的中断标志位置1,在下一个总线周期便立即进入中断总线周期。

(2)软件中断(内部中断)

软件中断(内部中断)不需要硬件支持,不受IF标志控制,不执行中断总线周期,除单步中断可通过TF标志位允许或禁止外,其余都是不可屏蔽的中断。软件中断有以下几种:

①除法出错中断。当CPU 在进行除法运算时,若发现除数为0或者所得的商超过了寄存器能容纳的范围,则自动产生一个类型为0的除法出错中断。

②单步中断。如果CPU 当前的中断标志位IF=1而且单步标志TF=1,那么每执行完一条指令后,会自动产生类型为1的单步中断。CPU 响应单步中断后,暂停执行下一条指令,转而执行单步中断服务程序,其结果是将CPU 的内部寄存器和有关存储器的内容显示出来,便于跟踪程序的执行,实现动态排错。

8086/8088系列微机中没有直接对标志寄存器的D8位(即TF标志置1或置0)指令,但可以通过堆栈操作指令改变TF的值。

【例7.2】 如果要使TF标志置1,可使用如下汇编语言程序段实现:

用类似的方法将标志寄存器与FEFFH 相与,可以使TF 标志位清0,从而禁止单步中断。

③溢出中断。当有符号数进行算术运算时,如果溢出标志位OF=1,则可由溢出中断指令INTO 产生中断类型号为4 的溢出中断。如果算术运算后OF=0,则执行INTO 指令后不会产生溢出中断。因此在有符号数加、减指令后应安排一条INTO 指令,一旦出现溢出就能及时向CPU 提出中断请求,CPU 响应溢出中断后可进行相应的处理。

④软件中断指令INT n。软件中断指令也称为软中断指令,其中n为中断类型号,n的取值范围为0~255。软中断指令可以安排在程序的任何位置上。一般来说,利用INT n指令能以软件方式调用所有256个中断的服务程序,当然其中有些中断实际上是由硬件触发的。除了可以使用INT n指令,当需要的时候调用大量为I/O 设备服务的子程序外,还可以利用这种指令来调试各种中断服务程序。例如,可通过调用INT 2指令执行NMI中断服务程序,从而不必在NMI引脚上添加外部信号,便能对NMI子程序进行调试。

⑤断点中断。在软件中断中,还有一种类型号为3的断点中断,它是一条单字节指令,是为调试程序而专门设置的。若在程序的某个位置设置了断点,每当程序运行到断点时便产生断点中断,这时也可以像单步中断一样,查看各寄存器和有关存储单元的内容。断点可以设置在程序的任何地方并可以设置多个断点,设置的方法是在断点处插入一条INT 3指令。由于断点可以设定在程序的关键位置,断点中断调试的速度往往比单步中断调试的速度要快得多。

3.中断向量表

(1)中断响应和返回

CPU 在响应中断的时候,首先不仅要把CS和IP寄存器的值也即断点送到堆栈保护起来,还要将标志寄存器的值压入堆栈进行保护,以保证在中断服务程序执行完后,能正确恢复CPU 的状态。然后CPU 找到中断服务程序的入口地址,转去执行相应的中断服务程序。中断服务程序执行结束后,CPU 通过执行中断返回指令IRET,从堆栈中恢复中断前CPU 的状态和断点,返回源程序(主程序)继续执行。因此,寻找中断服务程序的入口地址,是中断处理过程中的一个重要环节。

(2)中断向量表

通常,将中断服务程序的入口地址称为中断向量。8086/8088系列微机可处理256种中断,类型号为0~255(0~FFH)。每种中断对应一个入口地址,需要用4个字节存储CS和IP,这样256 种中断的入口地址要占用1K 字节。中断入口地址位于内存00000~003FFH 的区域中,存储了这些地址的连续空间称为中断向量表。

8086/8088 CPU 的中断向量表如图7.9所示。对于每个中断向量,使用两个高字节存放中断服务程序入口地址的段地址(CS),使用两个低字节存放该段地址的偏移量(IP)。因为每个中断向量要占用4个字节的存储单元,所以必须将中断类型号n 乘以4才能找到此类型的中断向量。

从类型0到类型4的5个中断被定义为专用中断,它们分别是:除法出错中断、单步中断、非可屏蔽(NMI)中断、断点中断和溢出中断。专用中断的中断服务程序的入口地址分别存放在00H、04H、08 H、0CH 和10 H 开始的4个连续单元中。例如,对类型号为2的非可屏蔽中断,它的中断服务程序的入口地址存放在00008 H~0000BH 单元中,其中CS存放在0000AH 开始的字单元中,IP存放在00008H 开始的字单元中。在8086/8088系列微机中,8259A 的中断输入端IR0~IR7引入的中断类型号为08FH~0FH,将这些中断类型号乘以4就可知道它们各自对应的中断向量。

下面通过举例来说明中断类型号n与中断向量表的关系。

图7.9 8086/8088 CPU 的中断向量表

【例7.3】 在某台微型机中,如果中断类型号为n=8(中断向量表的第9个入口地址),那么这个向量的中断服务程序的入口地址为:8×4=32=20H。如果类型号为8的入口地址中(00020H)=0200H、(00022H)=1000H,那么中断服务程序的入口地址为10200H=1000H×16+200H(CS=1000 H,IP=0200 H)。CPU 响应中断类型8的中断后,就转到地址10200H 开始的中断类型8的中断服务程序。

8086/8088系列微机开机启动后,会自动转到地址FFFF0 H 去执行启动程序,然后将存放在ROM BIOS数据区中的中断向量,装入RAM 中的指定区域(000~3FFH),在那里形成一个中断向量表。用户可通过程序修改中断向量表,也可根据需要设置新的中断向量,并运行相应的中断服务程序。不过,当微机重新启动(开机)后,中断向量表就又恢复了原来的内容。

4.中断优先级和中断嵌套

(1)中断优先级

8086/8088系列微机中有多个中断源,可能有多个中断源同时向CPU 提出中断请求,这时CPU 必须按各个中断的重要性和实时性等,为它们排列中断响应的次序,这个响应次序称为中断优先级。在8086/8088系列微机中,中断优先级从高到低的次序为

除法出错中断,类型0(软件中断);

溢出中断,类型4(软件中断);

INT n,类型n(软件中断);

NMI,类型2(硬件中断);

INTR,类型32~255(硬件中断);

单步中断,类型1(软件中断)。

其中,可屏蔽中断INTR 由8259A 中断控制器引入,由它进一步控制8级可屏蔽中断的优先级。

(2)中断嵌套

8086/8088CPU 响应中断时,会根据中断优先级的高低,先响应优先级高的,后响应优先级低的中断请求。当CPU 正在执行某一个中断服务程序时,如果有优先级更高的中断源提出请求,CPU 会暂时挂起正在处理的中断,先为优先级更高的中断服务,服务结束后再返回到刚才被暂时挂起的较低级的中断,这就是所谓的中断嵌套。中断嵌套仅应用于可屏蔽中断之中。

CPU 进入中断服务程序之后,硬件会自动执行关中断,禁止别的中断进入。只有在中断服务程序中,用开中断指令(STI指令)将中断打开后,才允许高级中断进入,实现中断嵌套。中断服务程序结束前,要用关中断指令(CLI指令)结束该级中断,并用IRET 指令返回到中断前的断点处去继续执行原程序。

例如,如果一个系统中有三个中断源,优先权的安排为:中断1为最高,中断3为最低,其中断处理嵌套如图7.10所示。