自定义键盘中断处理程序(Custom keyboard interrupt handler)

2019-09-17 01:47发布

我想编写简单的程序,将与定制一个只应递减某个变量代替标准键盘中断。 但是它不会没有旧处理程序调用工作。 这里是我的中断处理程序:

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

什么样的行动我也应该执行在我的处理程序,使其工作没有旧的处理程序? 谢谢。

Answer 1:

  1. 您需要保存DS在堆栈上,并将其设置为你的程序正确的值,然后将它还原之前iret

  2. 这部分:

     mov al,20h out 20h,al 

    响应中断。 如果调用BIOS中断处理程序,那么你不应该也这样做,因为BIOS处理程序将执行它。



Answer 2:

直到你从键盘缓冲区中读取当前的数据你会不会从键盘接收任何数据。 之前发送EOI至PIC使用

in al,60h

读取当前等待处理的扫描码。 究其原因调用旧中断处理程序的工作原理是因为它没有从键盘读取等待数据。

正如迈克尔·斯莱德注意,您需要与标签上的事实,担心自己EFOLDDS注册相访问。 DS中的值不能达到你的中断处理程序时不能依赖。 保证是可用的唯一段寄存器是CS,因为它是基于在所述中断向量表(IVT)的中断向量的段值设置。 如果你设计你的代码的其余部分,这样的变量EFOLD是在同一网段中断处理程序,那么你可以重写存储器上的操作数段是这样的:

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


文章来源: Custom keyboard interrupt handler