4

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

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

我还应该在我的处理程序中执行哪些操作以使其在不调用旧处理程序的情况下工作?

4

2 回答 2

1
  1. 您需要将 DS 保存在堆栈上并将其设置为适合您的程序的值,然后在iret.

  2. 这部分:

    mov al,20h
    out 20h,al
    

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

于 2012-05-07T11:06:32.937 回答
1

在从键盘缓冲区读取当前数据之前,您将不会从键盘接收任何进一步的数据。在将 EOI 发送给 PIC 之前,请使用

in al,60h

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

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

dec cs:[EF]
pushf
call cs:[OLD]
于 2018-12-16T18:13:56.357 回答