第十二章:内中断01
让编程改变世界
Change the world by program
引言和简介
中断是CPU处理外部突发事件的一个重要技术。 它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。 引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。
外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。 内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算 溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。 软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序以及DOS的系统功能调用(INT 21H)等都是软件中断。 CPU为了处理并发的中断请求,规定了中断的优先权。中断优先权由高到低的顺序是:
(1)除法错、溢出中断、软件中断 (2)不可屏蔽中断 (3)可屏蔽中断 (4)单步中断。中断处理程序
CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU根据中断信息可以找到要执行的处理程序。 我们知道,中断信息中包含有标识中断源的类型码。根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。 比如CPU 根据中断类型码 4,就可以找到4号中断的处理程序。 可随之而来的问题是,若要定位中断处理程序,需要知道它的段地址和偏移地址,而如何根据 8位的中断类型码(8086中断类型码为一个字节)得到中断处理程序的段地址和偏移地址呢? 这就要引入“中断向量表”了。中断向量表
CPU用 8 位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。那么什么是中断向量表呢?
中断向量表就是中断向量的列表。 中断向量表在内存中保存,其中存放着 256个中断源所对应的中断处理程序的入口,如图所示: [caption id="attachment_398" align="aligncenter" width="208"]![中断向量表就是中断向量的列表](http://blog.fishc.com/wp-content/uploads/2011/03/1.jpg)
检测点12.1
中断过程
从上面的讲解中,我们知道,可以用中断类型码,在中断向量表中找到中断处理程序的入口。 找到这个入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序。 用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。 CPU 硬件完成这个工作的过程被称为中断过程。8086CPU的中断过程:
(1)(从中断信息中)取得中断类型码; (2)标志寄存器的值入栈(保护标志位); (3)设置标志寄存器的第8位TF 和第9位IF的值为0;(这一步的目的后面将介绍) (4)CS的内容入栈; (5)IP的内容入栈; (6)从内存地址为中断类型码*4 和中断类型码*4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS。 可以看到CPU将CS、IP保存在栈中。 我们注意到,在中断过程中还要做的一个工作就是设置标志寄存器的TF、IF位。 对于这样做的目的,我们将在后面的内容和下一章中进行讨论。我们更简洁的描述中断过程,如下:
(1)取得中断类型码N; (2) pushf (3) TF = 0,IF = 0 (4) push CS (5) push IP (6)(IP) = (N*4),(CS) = (N*4+2) 在最后一步完成后,CPU 开始执行由程序员编写的中断处理程序。动画演示:
[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/12_内部中断过程.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"]![Get Adobe Flash player](http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif)