注册 登录
编程论坛 操作系统内核开发

请教getvect和setvect函数

星舞突击者 发布于 2012-08-10 17:26, 891 次点击
想自己重新实现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; /*修改中断号的中断函数地址*/
}
2 回复
#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); /*输出字符串*/
    }

}
1