定制键盘中断处理程序

时间:2012-05-07 10:36:28

标签: assembly dos masm x86-16 interrupt-handling

我正在尝试编写一个简单的程序来替换标准键盘中断,而自定义程序应该只减少一些变量。但是没有旧的处理程序调用它将无法工作。 这是我的中断处理程序:

handler proc
  push ax
  push di
  dec EF
  ;pushf      ;when these to instructions commented keyboard interrupts handling hangs
  ;call [OLD]
  mov al,20h
  out 20h,al
  pop di
  pop ax
  iret
handler endp

我还应该在我的处理程序中执行哪些操作才能使其无需旧处理程序? 感谢。

2 个答案:

答案 0 :(得分:1)

  1. 您需要在堆栈中保存DS并将其设置为适合您的程序的值,然后在iret之前将其恢复。

  2. 这部分:

    mov al,20h
    out 20h,al
    

    确认中断。如果你调用BIOS中断处理程序,那么你不应该这样做,因为BIOS处理程序会这样做。

答案 1 :(得分:1)

在您从键盘缓冲区读取当前数据之前,您不会从键盘上收到任何其他数据。在将EOI发送给PIC之前,先使用

in al,60h

读取当前等待处理的扫描代码。调用旧的中断处理程序的原因是因为它确实从键盘读取等待的数据。

正如迈克尔·斯拉德(Michael Slade)所指出的,您需要担心以下事实:相对于 DS 寄存器,访问标签EFOLD。到达中断处理程序时,不能依赖 DS 中的值。唯一保证可用的段寄存器是 CS ,因为它是根据中断向量表(IVT)中的中断向量的段值进行设置的。如果您设计其余的代码,以使变量EFOLD与中断处理程序位于同一段中,则可以通过以下方式覆盖内存操作数上的段:

dec cs:[EF]
pushf
call cs:[OLD]