建议使用头文件dos.h中提供的中断处理函数getvect()和setvect(),使用方法如下:
setvect()设置中断向量函数
setvect(int 中断号,void interrupt(*中断函数名))
功能:把中断服务程序的地址装入中断向量表中。
调用方法:setvect(中断号,中断函数名即地址);
(1)得预先定义要代替原函数的新函数
void interrupt 中断函数名(void)
{……}
(2)得先保留原中断函数地址
void interrupt (*保留函数名)(void);
保留函数名=getvect(中断号);
(3)事后得将原中断函数地址装回向量表中
setvect(中断号,保留函数名);
getvect()读取中断向量函数
原形:void interrupt(*getvect(int interruptno))
功能:读入由interruptno(0-255之间)所指定的中断向量值,并把该中断向量值
作为中断函数的远指针返回。
返回值:指定中断向量的当前4字节值。
头文件:dos.h
使用实例:oldfunc=getvect(5);
先定义void interrupt(*oldfunc)();
用后恢复setvect(5,oldfunc);
现在给出个实例,每隔一秒钟输出一个数,从1-10。
#include
#include
#define TIMER 0x1c /*软定时中断*/
int TimerCounter=0; /* 计时变量,每秒钟增加18。 */
/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */
void interrupt (*oldhandler)();
/* 新的时钟中断处理函数 */
void interrupt newtime()
{
TimerCounter++;
oldhandler();
}
/* 设置新的时钟中断处理过程 */
void SetTimer(void interrupt (*IntProc)())
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/* 恢复原有的时钟中断处理过程 */
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}
int main()
{
int key,time=0;
SetTimer(newtime); /* 修改时钟中断 */
while(1)
{
if (TimerCounter>18) /* 1秒钟处理一次 */
{
/* 恢复计时变量 */
TimerCounter=0;
time++;
printf(“%d\n”,time);
if(time==10) /* 10秒钟后结束程序 */
break;
}
}
KillTimer(); /* 恢复时钟中断 */
}