我正在尝试覆盖默认中断,以便如果用户按住键,则每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到31个中断向量,并且如果您覆盖其中之一,则无法预测输出。

  ask by Dvir Yamin translate from so

未解决问题?本站智能推荐:

1回复

试图了解asm中断,特别是16hfunc01H

这是为家庭作业,我不指望你解决我的问题,只需要一些理解...... 我必须在dosbox中使用ASM和C. 我的第一个问题是我真的不明白如何使用bios中断(任何有代码示例的好教程都会非常感激),好吧,我得到了中断,每个都有自己的功能和参数...... 无论如何我已经尝试了...我需要
1回复

ARM汇编器中可变大小的int矩阵

我目前正在尝试在ARM汇编器中实现矩阵乘法。 我已经阅读了一些有关汇编器中矩阵计算的教程,它们都在3x3或4x4浮点矩阵上使用NEON指令。 但这与我想做的完全不同。 我有两个对称的int矩阵,因此这两个矩阵的行数和列数相同,并且我的汇编函数将矩阵的大小作为参数,因此我无法像本教程中那样仅
1回复

分割错误和int10h

我写了输出带有参数的字符串的代码,但是我的程序由于Segmentation fault:11而崩溃。 PS:我使用Unix(os x)。
2回复

汇编中断问题:int13h(ah=42h)返回cf=1,ah=1失败

我想用汇编语言编写一个程序来读取硬盘的主分区。 我连续几天用Google搜索了一下,我发现也许int 13h(啊= 42h)对我而言。 但我一开始就失败了。 调用INT 13H后,CF设置为1,AH为1.从文档中我知道中断失败。 这是我的代码: 谢谢!
3回复

如何使用INT10h打印号码

我检查了有关各种INT 10h函数的维基百科。 但是我找不到一个可以打印数字的东西,我的意思不是字符串,而是整数。 例如,我需要校准1 + 2 + 3 + 4并打印输出。 我能怎么做?
2回复

使用Int13h与FreeDos调试

我正在进行一些装配,作为学校项目的一部分,我使用Int 13h 08来读取当前的磁盘参数,但是我搞砸了。 我在VirtualBox中使用FreeDOS,并使用Debug。 我的代码是: 无论终止部分如何,我所知道的任何内容都不会被退回/打印。 我需要提出某种类型的打印代码吗? 我也
1回复

换行(0AH)搞乱了视频中断INT10H

我正在尝试编写一个使用嵌套循环的简单代码,以下列模式打印字符, 这是代码,代码工作得非常好 但是一旦我使用清晰屏幕使用视频中断输出完全搞砸了, 这是输出, 这是代码, 但是当我删除每次迭代后留下一行的换行符,即 输出跟随预期, 我不明白清晰的屏幕代码与换行代码有什么关
1回复

INT10、13h如何使用属性?

嘿,我试图理解INT 10h,13h(19),该字符以ah的13h写入BIOS中断10的字符串。 我在下面找到了有关将不同标志放入不同寄存器的信息。 我仍然不知道的一件事是BL中应该包含的内容,如果我只是想使用此函数编写字符串,则BL中的属性应该是什么? 现在,它会写出没有意义的奇怪的闪烁