预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

转载软中断详解 原文地址:软中断详解作者:经纬软中断:编程异常通常叫做软中断软中 断是通讯进程之间用来模拟硬中断的一种信号通讯方式。中断源发中断请求或 软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信 号对应的功能软中断是软件实现的中断,也就是程序运行时其他程序对它的中断; 而硬中断是硬件实现的中断,是程序运行时设备对它的中断。1.软中断发生的时 间是由程序控制的,而硬中断发生的时间是随机的2.软中断是由程序调用发生 的,而硬中断是由外设引发的3.硬件中断处理程序要确保它能快速地完成它的 任务,这样程序执行时才不会等待较长时间对于一般的C语言爱好者而言,就如 何在C中使用中断例程这一问题应该已经非常熟悉,例如,我们可以通过 int86()函数调用13H号中断直接对磁盘物理扇区进行操作,也可以通过 INT86()函数调用33H号中断在屏幕上显示鼠标光标等。其实,13H号也好, 33H号也好,它们只不过就是一些函数,这些函数的参数通过CPU的寄存器传 递。中断号也只不过是间接地指向函数体的起始内存单元,说它是间接的,也 就是说,函数的起始段地址和偏移量是由中断号通过一种方法算得的(具体如何 操作,下面会作解释)。如此一来,程序员不必要用太多的时间去写操作硬件的 程序了,只要在自己的程序中设置好参数,再调用BIOS或DOS提供的中断服务 程序就可以了,大大减小了程序开发难度,缩短了程序开发周期。那么中断既 然是函数,就可以由用户任意的调用、由用户任意地编写。计算机内存的前 1024个字节(偏移量00000H到003FFH)保存着256个中断向量,每个中断向量 占4个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节 保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器IP及CS 中,就可以转入中断服务程序实现中断调用。每当中断发生时,CPU将中断号 乘以4,在中断向量表中得到该中断向量地址,进而获得IP及CS值,从而转 到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用 的基本过程。在计算机启动的时候,BIOS将基本的中断填入中断向量表,当 DOS得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分 BIOS的中断向量。有一部分中断向量是系统为用户保留的,如60H到67H号中 断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还 可以自己更改和完善系统已有的中断向量。在C语言中,提供了一种新的函数 类型interrupt,专门用来定义中断服务程序,比如我们可以写如下的中断服 务程序:/*例1:中断服务程序*/voidinterruptint60(){puts("Thisisan example");}该中断的功能就是显示一个字符串,为什么不用printf()函数呢? 这就牵涉到DOS的重入问题,后面将作一些介绍。一个简单的中断服务程序写 好了,如何把它的函数入口地址填写到中断向量表中,以便在产生中断的时候 能转入中断服务程序去执行呢?这里要用到setvect()和getvect()函数。 setvect()有两个参数:中断号和函数的入口地址,其功能是将指定的函数安装 到指定的中断向量中,getvect()函数有一个参数:中断号,返回值是该中断的 入口地址。在安装中断以前,最好用disable()函数关闭中断,以防止在安装 过程中又产生新的中断而导致程序运行混乱,待安装完成后,再用enable()函 数开放中断,使程序正常运行。现在我们可以把上面的例子再丰富一下:/*例 2:中断服务程序的编写、安装和使用*/ #include #include #ifdef__cplusplus #define__ARGU. #else #define__ARGU #endifvoidinterruptint60(__ARGU)/*中断服务函数*/ { puts("Thisisanexample"); } voidinstall(voidinterrupt(*fadd)(__ARGU),intnum)/*安装中断 */{disable();/*关闭中断*/setvect(num,fadd);/*设置中断*/enable();/* 开放中断*/}voidmain(){install(int60,0x60);/*将int60函数安装到0x60 中断*/geninterrupt(0x60);/*人为产生0x60号中断*/}有一定经验的读者很 容易得到该程序的执行结果:在屏幕上显示"Thisisanexample!"。编写、 安装中断服务程序的方法