ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:28KB ,
资源ID:6102923      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6102923.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言中断原理.doc)为本站会员(kpmy5893)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

C语言中断原理.doc

1、【转】 系统级 C 语言程序设计(中断原理简介) 摘要:本文主要介绍 C 语言中中断服务程序的编写、安装和使用。由于硬中断服务程序的编写涉及到硬件端口读写操作,使得用户直接和硬件打交道,在程序设计过程中要用到的数据(如硬件端口地址等)比较多,这就使程序员和计算机的硬件设备间缺少一种“缓冲”的作用,况且,用汇编语言来直接对硬件编程要方便得多。本文仅对软中断程序的编写作个介绍。 关键词:软中断、中断向量、中断向量表、TSR 内存驻留、 DOS 重入、中断请求、段地址、偏移量、寄存器、BIOS、DOS、setvect ( )、getvect ( )、keep ( )、disable ( )、enab

2、le ( )、geninterrupt ( )、int86 ( )、interrupt 对于一般的 C 语言爱好者而言,就如何在 C 中使用中断例程这一问题应该已经非常熟悉,例如,我们可以通过 int86 ( )函数调用 13H 号中断直接对磁盘物理扇区进行操作,也可以通过 INT86 ( )函数调用 33H 号中断在屏幕上显示鼠标光标等。其实,13H 号也好,33H 号也好,它们只不过就是一些函数,这些函数的参数通过 CPU 的寄存器传递。中断号也只不过是间接地指向函数体的起始内存单元,说它是间接的,也就是说,函数的起始段地址和偏移量是由中断号通过一种方法算得的(具体如何操作,下面会作解释)

3、 。如此一来,程序员不必要用太多的时间去写操作硬件的程序了,只要在自己的程序中设置好参数,再调用BIOS 或 DOS 提供的中断服务程序就可以了,大大减小了程序开发难度,缩短了程序开发周期。那么中断既然是函数,就可以由用户任意的调用、由用户任意地编写。 计算机内存的前 1024 个字节(偏移量 00000H 到 003FFH)保存着 256 个中断向量,每个中断向量占 4 个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器 IP 及 CS 中,就可以转入中断服务程序实现中断调用。每当中断发生时,CPU 将中断号乘以 4,

4、在中断向量表中得到该中断向量地址,进而获得 IP 及 CS 值,从而转到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用的基本过程。在计算机启动的时候,BIOS 将基本的中断填入中断向量表,当 DOS 得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分 BIOS 的中断向量。有一部分中断向量是系统为用户保留的,如 60H 到 67H号中断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还可以自己更改和完善系统已有的中断向量。 在 C 语言中,提供了一种新的函数类型 interrupt,专门用来定义中断服务程序,比如我们可以写如下的中断服务程序: /

5、*例 1:中断服务程序*/ void interrupt int60() puts(“This is an example“); 该中断的功能就是显示一个字符串,为什么不用 printf ( )函数呢?这就牵涉到 DOS 的重入问题,后面将作一些介绍。 一个简单的中断服务程序写好了,如何把它的函数入口地址填写到中断向量表中,以便在产生中断的时候能转入中断服务程序去执行呢?这里要用到 setvect ( )和 getvect ( )函数。setvect ( )有两个参数:中断号和函数的入口地址,其功能是将指定的函数安装到指定的中断向量中,getvect ( )函数有一个参数:中断号,返回值是该中

6、断的入口地址。在安装中断以前,最好用 disable ( )函数关闭中断,以防止在安装过程中又产生新的中断而导致程序运行混乱,待安装完成后,再用 enable ( )函数开放中断,使程序正常运行。现在我们可以把上面的例子再丰富一下: /*例 2:中断服务程序的编写、安装和使用 */ #include #include #ifdef _cplusplus #define _ARGU . #else #define _ARGU #endif void interrupt int60 (_ARGU) /*中断服务函数*/ puts(“This is an example“); void instal

7、l (void interrupt (*fadd)(_ARGU),int num) /*安装中断*/ disable(); /*关闭中断*/ setvect(num, fadd); /*设置中断*/ enable(); /*开放中断*/ void main() install (int60,0x60);/*将 int60 函数安装到 0x60 中断*/ geninterrupt (0x60); /*人为产生 0x60 号中断*/ 有一定经验的读者很容易得到该程序的执行结果:在屏幕上显示“This is an example!”。 编写、安装中断服务程序的方法就介绍这些。下面再浅谈一下内存驻留程

8、序(TSR)的编写和使用。在 C 语言中,可以用 keep ( )函数将程序驻留内存。这个函数有两个参数:status 和 size。size 为驻留内存长度,可以用 size=_SS+_SP/16-_psp 得到,当然这也是一种估算的方法,并不是精确值。函数执行完以后,出口状态信息保存在 status 中。比如,对于上面的例子,将“geninterrupt (0x60);”改写成“keep(0,_SS+_SP/16-_psp);”后再执行程序,这一段程序就被驻留,此后在其它的任何软件或程序设计中,只要用到了 60H 号中断,就会在屏幕上显示“This is an example!”的字样。要

9、恢复系统对 60H 号中断的定义,只能重新启动计算机。 像上面的例子其实还很不完善,它没有考虑 DOS 系统环境的状态、没有考虑程序是否已经驻留内存、没有考虑退出内存驻留等问题。对于第二个问题还是很容易解决的:执行程序一开始就读取某一函数中断入口地址(如 63H 号中断)判断是否为空(NULL ) ,如果为空就先将该地址置为非空再驻留内存,若为非空则表示已经驻留并退出程序。这一步判断非常重要,否则将会因为重复驻留占用过多内存空间而最后造成系统崩溃。至于其它两个问题,在此不多作说明,有兴趣的读者可以参考一些有关书籍。 不仅如此,我们还可以通过在 DOS 下使用热键(Hotkey)来调用内存驻留程

10、序。比如将希望汉字系统自带的希望词典驻留内存后,在任意时刻按下 Ctrl+F11 键,就能激活程序,出现词典界面。微机的键盘中有一个微处理芯片,用来扫描和检测每个按键的按下和释放状态。大多数按键都有一个扫描码,告知 CPU 当前的状态,但一些特殊的键如PrintScreen、Ctrl+Break 等不会产生扫描码,而直接产生中断。正因为如此,我们可以将Ctrl+Break 产生的中断号指向我们自己写好的程序入口地址,那么当按下 Ctrl+Break 后,系统就会调用我们自己的程序去执行,这实际上也就是修改了 Ctrl+Break 的中断向量。至于其它按键激活程序则可以利用 9H 号键盘中断捕获

11、的扫描码来实现,在此不多作说明。例如,执行下面的程序后,退回 DOS 系统,在任意的时候按下 Ctrl+Break 后,屏幕的底色就会变成红色。 /*例 3:中断服务程序编写、安装和使用,内存驻留 */ #include #include #ifdef _cplusplus #define _ARGU . #else #define _ARGU #endif void interrupt newint(_ARGU); /*函数声明*/ void install (void interrupt (*fadd)(_ARGU), int num); int main() install (newin

12、t,0x1b); /*Ctrl+Break 中断号:1BH*/ keep(0,_SS+(_SP/16)-_psp); /*驻留程序*/ return 0; void interrupt newint(_ARGU) textbackground(4); /*设置屏幕底色为红色*/ clrscr(); /*清除屏幕 */ void install (void interrupt (*fadd)(_ARGU), int num) disable(); setvect(num,fadd); /*设置中断 */ enable(); 由于 13H 号中断是 BIOS 提供的磁盘中断服务程序,对于 DOS

13、下的应用程序,它们的存盘、读盘功能都是通过调用这一中断来实现的。有许多 DOS 下的病毒就喜欢修改 13H 号中断来破坏系统,例如,修改 13H 号中断服务程序,将其改成: /*例 4:病毒体程序伪代码*/ void interrupt new13(_ARGU) if (病毒发作条件成熟) 修改入口参数指向病毒程序入口地址; 执行病毒代码; 调用原来的 13H 中断; 只要当任一软件(如 EDIT.COM 等)对磁盘有操作并且病毒发作条件成熟时,病毒就被激活。当然,这样做会导致可用内存空间减少,容易被用户发现。一些“聪明”的病毒又会去修改其它的中断向量,使得系统报告的内存大小和实际相符合。还有的病毒,当发现用户通过一些程序(如 DEBUG.COM 等)去跟踪它时,它会悄悄地溜掉,其基本原理仍然与修改中断有关。硬盘的 0 面 0 柱 1 扇区(Side 0 Cylinder 0 Sector 1)保存着重要的引导信息,一旦破坏,计算机将无法识别硬盘。我们可以写一个程序来防止任何软件(包括病毒)对这一扇区执行“写” 操作,一定程度上实现了“ 写保护”的作用,它的基本原理就是修改 13H号中断向量并常驻内存,监视着软件(包括病毒)对磁盘操作的每一个细节。读者请注意:本程序没有考虑内存驻留的退出,如果想恢复 13H 号中断,请重新启动计算机。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报