C语言中断编程(C--五子棋实例).doc
C语言中断编程(C——五子棋实例)
中断是微处理器与外部设备进行信息交换的一种方式。使用中断,可以获得更高的执行速度和更好的交互效果(如游戏编程中对鼠标或键盘的调用来完成某些游戏功能)。本文档以简单“五子棋双人游戏”为案例,整个游戏过程用鼠标操作完成,很好的阐明中断在程序中简便操作和简单明了的交互作用。
图1、五子棋双人游戏屏幕截图(蓝棋胜)
BIOS(Basic Input Output System),中文是“基本输入输出系统”。它是全称是ROMBIOS,即只读存储器基本输入输出系统。实际上它是一组固化到计算机主板上的一个ROM芯片上的程序,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。
BIOS的主要有以下3个作用:
1、自检及初始化程序
计算机电源接通后,系统有一个对内部各个设备进行检查的过程,由一个称为POST(Power On SelfTest,上电自检)的程序完成,这也是BIOS程序的一个功能。完整的自检包括对CPU、640KB的基本内存、1MB以上睥扩展内存、ROM、主板、CMOS存储器、串并口、显示卡、软硬盘子系统及键盘的测试。
2、硬件中断处理
计算机开机的时候,BIOS会通知CPU等硬件设备的中断号。操作时,当输入了使用某个硬件的命令后,它就会根据中断使用相应的硬件完成命令的工作,最后根据中断号跳回原来的状态。
3、程序服务请求
从BIOS的定义可以看出它总是和计算机的输入输出设备打交道,通过特定的数据端口发出指令,发送或接收各类外部设备的数据,从而实现软件应用程序对硬件的操作。
BIOS功能调用
C语言提供了一些BIOS功能调用函数,方便用户在自己的程序中进行BIOS调用有int86()函数、int86x()函数和geninterrupt()函数。
1. int86()函数
int int86(int intr_num,union REGS *inregs,union GEGS *outregs);第1个参数intr_num表示BIOS调用类型号;第2个参数表示指向联合类型REGS的指针,用于接收调用的功能号及其他一些指定的入口参数,以便传给相应的寄存器;第3个参数也是一个指向联合类型REGS的指针,用于接收功能调用后的返回值,即出口参数。
联合类型REGS在dos.h文件中定义:
struct WORDREGS {
unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};
struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
union REGS{
struct WORDREGS x;
struct BYTEREGS h;
};
2. int86x()函数
int int86x(int intno,union REGS *inregs,union REGS *outregs,struct SREGS *segregs);函数中前3个参数与int86()函数中的相同,第4个参数是一个结构SREGS类型的指针。该结构在dos.h头文件中定义:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
该结构是为了设置和保存段寄存器的值,在int86x()函数中,只用了SREGS结构中的ds和es,它对应于数据寄存器DS和附加寄存器ES。进行int86x()函数调用时,要设置两个寄存器为要改变的值。调用时,该函数自动将原来未改变的值保存,然后使用改变后的DS和ES的值,调用结束后,该函数又自动恢复原来的值。
3. geninterrupt()函数
int geninterrupt(int intr_num);参数intr_num表示功能调用的类型号。具体的功能号和入口参数则在调用该函数前通过Turbo C中伪寄存器_AH、_AL指定。
鼠标中断编程应用实例
DOS操作系统和Turbo C 2.0并不支持鼠标器的操作,因而要使用鼠标器,必须首先要安装相应的驱动程序,通常使用的方法是在CONFIG.SYS文件中加入一行信息:DEVIVE=MOUSE.SYS。使得在DOS启动时,将鼠标的驱动程序也装入内存,或者也可以直接运行mouse.orn文件,使它驻留在内存。
安装好鼠标的驱动程序并进行初始化后,就可以使用鼠标驱动程序管理鼠标的