覆盖默认值int 8h,9h

时间:2015-03-31 12:29:43

标签: c assembly int interrupt

我正在尝试覆盖默认中断,这样如果用户按下并按住键,它将每5秒输入3次。如果用户在没有按住的情况下按下并释放,则它将作为默认值

这就是我所拥有的:

#include <stdio.h>
#include <dos.h>

void interrupt (*Int9Save) (void);
void interrupt(*Int8Save) (void);
void start_press_limit(void);
void end_press_limit(void);
volatile int count=0,sum=0;

void interrupt h9(void)
{

    if(count < 3) {
        asm{
            PUSHF
            CALL DWORD PTR Int9Save
        }
        count++;
    }
}

void interrupt h8(void)
{
    asm{
        PUSHF
        CALL DWORD PTR Int8Save
    }
    sum++; /*counter*/
    if (sum >= 90) {
        sum = 0;
        count = 0;
    }
}

//main
int main(void)
{

    int scan_code = 0;
    char ascii_code;

    start_press_limit();

    do {
        asm{
            PUSH AX
            MOV AH, 0
            INT 16h
            MOV BYTE PTR scan_code, AH
            MOV ascii_code, AL
            POP AX
        } // asm
        printf("%c", ascii_code);

    } while (scan_code != 1);
    end_press_limit();
    return 0;
}

 void start_press_limit(void) {
     Int9Save = getvect(9); // save old func
     setvect(9, h9);    // new func
     Int8Save = getvect(8); // save old func
     setvect(8, h8);    // new func
 }

 void end_press_limit(void) {
     setvect(9, Int9Save);  // old func
     setvect(8, Int8Save);  // old func
 }

1 个答案:

答案 0 :(得分:0)

英特尔手册明确指出,您不能覆盖系统默认的0到31个中断向量,如果您覆盖其中一个,则无法预测输出。