无法让中断处理程序在 C 中工作

Unable to get interrupt handlers to work in C

我目前在让中断处理程序在 C 中工作时遇到问题。我的代码的想法是将向量设置为 IRQ 0,这是 PIT,从我能找到的是中断 8 (0x08),在将 PIT 设置为以大约 40hz 的频率运行后(据我所知,这是通过设置值 29829 或 0x7485.

该程序的最终预期结果是数到一秒,在屏幕上打印一些内容,然后重复 20 次,此时它会自行卸载。

这个程序是使用 Borland 的 Turbo C 在 Am486-DX4-100 运行 上以 120mhz 和 IBM 的 PC-DOS 2000 编译的。该板是 DataExpert 的 Socket 3 EXP-4045,但我有DOSBox 上的结果相同。

代码如下:

#include <dos.h>
#include <stdio.h>
int a = 0;
int b = 0;
void interrupt clocktick(){
    if(a == 40){
        if(b == 20){
            setvect(8, NULL);
        }else b++;
    }else a++;
}
int main(void){
    /* set PIT mode*/
    outp(0x34, 0x43);
    outp(0x85,0x40); /* send low byte*/
    outp(0x74,0x40); /* send high byte*/
    setvect(0x08, clocktick);
    while(1==1){
        printf("a%i, b%i", a, b);
    }
    getchar();
    return 0;
}

代码编译正常,当 运行 时,while 外观确实显示 A 已递增一次,但不会再次触发。显然有什么东西正在产生中断,它甚至可能是 PIT,但它不会不止一次发生。

我正在尝试遵循 1987 年的 Turbo C 用户手册,其中试图描述安装中断向量的方法,但我显然做错了什么。

我还要说对不起,我不知道这些东西。我不是要浪费别人的时间,但我真的需要帮助。我的例子很空泛,经过一些评论后,我确实看到了我本可以做的事情来弄清楚发生了什么。

你需要告诉PIC你已经完成了中断处理,否则它不会再发出信号。通常这是通过将 EOI (0x20) 发送到 PIC 基本端口 (0x20) 来完成的,因此它基本上类似于 outportb(0x20, 0x20);,最好在处理程序的末尾附近。

有一些关于 PIC 的信息,例如https://wiki.osdev.org/8259_PIC