#2
星舞突击者2012-08-11 11:19
搞定了,贴上代码
程序代码: #include<stdio.h> #include<conio.h> typedef void (* int_fun)(void); typedef interrupt void (far* new_int_fun)(void); #define INTR 28 /* 中断号 */ int interrupt_count = 0; /* 显示程序当前已触发的中断总数目*/ char msg[51]; /* * 向屏幕打印字符串 */ int print_string(int pos, char * string, unsigned char attr) { char far * video_memory = (char far *)0xb8000000; char * str = string; video_memory += pos * 2; while(*str != '\0') { *video_memory++ = *str; *video_memory++ = attr; str++; } return (str - string); } void interrupt (far * old_time) (void); /* 定义 中断变量*/ /* * 新的中断函数 */ void interrupt new_time(void) { interrupt_count++; /* interrupt number increase when interrupt occur */ old_time(); /* old time interrupt handler*/ } /* * 根据中断号,显示中断入口函数地址 */ new_int_fun get_vect(char int_num) { new_int_fun far * int_pointer = (new_int_fun far *)(int_num * 4);/*中断函数入口地址= 中断号*4*/ return (*int_pointer);/*返回中断号所对应的中断函数地址*/ } /* * 根据中断号,写入 新的 中断函数 */ void set_vect(char int_num, new_int_fun new_fun) { new_int_fun far *int_pointer = (new_int_fun far *)(int_num * 4);/*中断函数入口地址= 中断号*4*/ *int_pointer = new_fun;/*写入写的中断函数地址*/ } void main(void) { clrscr(); old_time = get_vect(INTR); /* save the old time handler*/ set_vect(INTR,new_time); /* install the new interrupt handler*/ while(1) { sprintf(msg,"the interrupt %d is runnning...",interrupt_count); print_string(100,msg,0x07); /*输出字符串*/ } } |
想自己重新实现getvect和setvect的功能,所以自己写了get_vect和set_vect,结果很郁闷,总是出问题,有谁能给点建议吗,下面是测试例子的部分代码
typedef void interrupt (* interrupt_function)(void);
/*
* 传入 中断号,根据中断号返回中断号所对应的中断处理函数的地址
*/
interrupt_function interrupt get_vect(unsigned int interrupt_number) {
/*dos是运行在实模式下,在访问其他段时,用far指针
* 中断向量是存放在内存的 0x0-0x3ff,每个中断向量用4字节存放
* 中断号*4=中断函数的入口地址
*/
interrupt_function far * interrupt_pointer = (interrupt_function far *)(interrupt_number * 4);
return (*interrupt_pointer);/* 返回中断函数的地址 */
}
/*
* 修改中断号对应的中断函数地址
*/
void interrupt set_vect(unsigned int interrupt_number, interrupt_function int_fun) {
/*
* 中断号*4= 中断函数的地址
*/
interrupt_funtion far * interrupt_pointer = (interrupt_function far *)(interrupt_number * 4);
*interrupt_pointer = int_fun; /*修改中断号的中断函数地址*/
}