内中断
任何一个通用的CPU,比如8086 ,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU 外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断的意思是指, CPU 不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。
1 内中断的产生
对于8086CPU,当CPU 内部有下面的情况发生的时候,将产生相应的中断信息。
- 除法错误,比如,执行div 指令产生的除法溢出:
- 单步执行:
- 执行into 指令:
- 执行int 指令。
要进行不同的处理, CPU 首先要知道,所接收到的中断信息的来源。所以中断信息中必须包含识别来源的编码。8086CPU 用称为中断类型码的数据来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256 种中断信息的来源。以后,我们将产生
中断信息的事件,即中断信息的来源, 简称为中断源, 上述的4 种中断源,在8086CPU中的中断类型码如下。
- 除法错误:0
- 单步执行:1
- 执行into指令:4
- 执行int指令:
- 该指令的格式为int n,指令中的n 为字节型立即数,是提供给CPU 的中断类型码。
2 中断向量表
CPU 收到中断信息后,需要对中断信息进行处理。而如何对中断信息进行处理,可以由我们编程决定。我们编写的,用来处理中断信息的程序被称为中断处理程序。一般来说,需要对不同的中断信息编写不同的处理程序。若要8086CPU 执行某处的程序,就要将cs:IP指向它的入口(即程序第一条指令的地址) 。可见首要的问题是, CPU 在收到中断信息后,如何根据中断信息确定其处理程序的入口。
CPU 用8 位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
中断向量,就是中断处理程序的入口地址。展开来讲,中断向量表,就是中断处理程序入口地址的列表。
中断向量表在内存中保存,其中存放着256 个中断源所对应的中断处理程序的入口
一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,对于8086CPU ,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。
3 中断过程
可以用中断类型码,在中断向量表中找到中断处理程序的入口。找到这个入口地址的最终目的是用它设置cs 和IP,使CPU 执行中断处理程序。用中断类型码找到中断向量,并用它设置cs 和IP ,这个工作是由CPU 的硬件自动完成的。CPU 硬件完成这个工作的过程被称为中断过程。
CPU 在执行完中断处理程序后,应该返回原来的执行点继续执行下面的指令。所以在中断过程中,在设置CS:IP 之前,还要将原来的cs 和IP 的值保存起来。在使用call 指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行,所以, call 指令先保存当前cs 和IP 的值,然后再设置cs 和IP
- (从中断信息中)取得中断类型码:
- 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中):
- 设置标志寄存器的第8 位TF 和第9 位IF 的值为0(这一步的目的后面将介绍):
- cs 的内容入栈;
- IP 的内容入栈:
- 从内存地址为中断类型码叫和中断类型码+2 的两个字单元中读取中断处理程序的入口地址设置IP 和cs 。
我们更简洁地描述中断过程,如下:
- 取得中断类型码N;
- pushf
- TF=O, IF=O
- push CS
- push IP
- (IP)=(N4), (CS)=(N4+2)
- 在最后一步完成后, CPU 开始执行由程序员编写的中断处理程序。
4 除法错误中断的处理
mov ax, lOOOh
mov bh,1
div bh
内存0000:0000~0000:03ff,大小为IKB 的空间是系统存放中断处理程序入口地址的中断向量表。8086 支持256 个中断,但是,实际上,系统中要处理的中断事件远没有达到256 个。所以在中断向量表中,有许多单元是空的。
中断向量表是PC 系统中最重要的内存区,只用来存放中断处理程序的入口地址,DOS 系统和其他应用程序都不会随便使用这段空间。可以利用中断向量表中的空闲单元来存放我们的程序。一般情况下,从0000:0200 至0000:02FF 的256 个字节的空间所对应
的中断向量表项都是空的,操作系统和其他应用程序都不占用。
当中断0发生时, CPU 将转去执行中断处理程序。只要按如下步骤编写中断处理程序,当中断。发生时,即可显示“overflow !”
① 相关处理:
② 向显示缓冲区送字符串“overflow !”;
③返回DOS 。
我们将这段程序称为: doO 。
assume cs:code
code segment
start : doO 安装程序
设置中断向量表
mov ax,4c00h
int 2lh
doO: 显示字符串” overflow !”
mov ax,4c00h
int 2lh
code ends
end start
从CPU 的角度看一下,什么是中断处理程序?
- 程序12.1 在执行时,被加载到内存中,此时doO 的代码在程序12.1 所在的内存空间中,它只是存放在程序12.1 的代码段中的一段要被传送到其他单元中的数据,我们不能说它是0 号中断的中断处理程序;
- 程序12.1 中安装doO 的代码执行完后, doO 的代码被从程序12.1 的代码段中复制到0:200 处。此时,我们也不能说它是0 号中断的中断处理程序,它只不过是存放在0:200 处的一些数据:
- 程序12.1 中设置中断向量表的代码执行完后,在0 号表项中填入了doO 的入口地址0:200 ,此时0:200 处的信息,即doO 的代码,就变成了0号中断的中断处理程序。因为当除法溢出(即0 号中断)发生时, CPU 将执行0:200 处的代码。
号表项中填入了doO 的入口地址0:200 ,此时0:200 处的信息,即doO 的代码,就变成了0号中断的中断处理程序。因为当除法溢出(即0 号中断)发生时, CPU 将执行0:200 处的代码。