我正在尝试更改我的中断表以接管键盘中断。我的最终目标是编写我的新中断例程,将自己复制到 RAM 中并使实模式中断表指向我。
我在网上找到了随机示例代码,但缺少有关如何获取原始中断地址的说明。他们只是在他们的位置上有变量,以及如何将自己放入内存中。
所以我的问题是如何找出或打印到屏幕上的实模式中断表?
和/或如果有人有任何好的代码示例来禁用某些键或在某些键上发出哔哔声,我真的很感激。
谢谢!
在 16 位实模式下,中断表从地址 0 开始,有 256 个 4 字节条目。256 个中断向量中的每一个都在该表中获得一个 4 字节地址(段 + 偏移量)。
http://en.wikipedia.org/wiki/Interrupt_descriptor_table有更多细节。
如果您的程序在 DOS 下运行,您可以(并且可能应该)使用 DOS 提供的 API:
MOV AH,35H ; function 35H is Get Vector
MOV Al,9 ; slot in IDT for keyboard interrupt
INT 21H ; call DOS, contents of old vector in ES:BX (save them somewhere)
.
.
MOV AH,25H ; function 25H is Set Vector
MOV AL,9
PUSH CS ; the new vector is passed in DS:DX, so copy CS to DS
POP DS : (assuming your new handler is in the same seg as other code)
MOV DX,NewHandler
INT 21H