1

我需要为 x86 开发程序,通过轮询 IRR 来处理键盘中断。程序应该在 ms-dos 下以实模式运行。我的主要问题是它不能像我认为的那样工作:即使没有按下任何键并且从端口 0x60 读取的值始终为 0x1c,相应的 IRR 位也具有非零值。有人可以解释我做错了什么吗?这是我的轮询循环:

        in al,21h       ; read old IMR value
        or al,02h       ; disable handling of interrupts from IRQ1
        out 21h,al      ; update IMR value
READ_LOOP:
        mov al,0ah
        out 20h,al
        in al,20h       ; read IRR value
        and al, 02h     ; check request from IRQ1
        jz READ_LOOP
        in al,60h       ; read data from keyboard buffer
        mov dl,al
        and dl,7fh      ; ignore most significant bit value
        mov ah,2h       ; print char
        int 21h
        jmp READ_LOOP

谢谢!

更新 我错过了键盘缓冲区包含扫描码的事实,所以 0x1c 似乎是返回键的扫描码。=)

4

0 回答 0