我正在尝试编写一个简单的程序来替换标准键盘中断,而自定义程序应该只减少一些变量。但是没有旧的处理程序调用它将无法工作。 这是我的中断处理程序:
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
我还应该在我的处理程序中执行哪些操作才能使其无需旧处理程序? 感谢。
答案 0 :(得分:1)
您需要在堆栈中保存DS并将其设置为适合您的程序的值,然后在iret
之前将其恢复。
这部分:
mov al,20h
out 20h,al
确认中断。如果你调用BIOS中断处理程序,那么你不应该这样做,因为BIOS处理程序会这样做。
答案 1 :(得分:1)
在您从键盘缓冲区读取当前数据之前,您不会从键盘上收到任何其他数据。在将EOI发送给PIC之前,先使用
in al,60h
读取当前等待处理的扫描代码。调用旧的中断处理程序的原因是因为它确实从键盘读取等待的数据。
正如迈克尔·斯拉德(Michael Slade)所指出的,您需要担心以下事实:相对于 DS 寄存器,访问标签EF
和OLD
。到达中断处理程序时,不能依赖 DS 中的值。唯一保证可用的段寄存器是 CS ,因为它是根据中断向量表(IVT)中的中断向量的段值进行设置的。如果您设计其余的代码,以使变量EF
和OLD
与中断处理程序位于同一段中,则可以通过以下方式覆盖内存操作数上的段:
dec cs:[EF]
pushf
call cs:[OLD]