我正在尝试更改我的中断表以接管键盘中断。我的最终目标是编写新的中断例程,将自己复制到RAM中并使实模式中断表指向我。
我在网上找到了随机sample code,但是没有解释如何获取原始中断的地址。他们只是在他们的位置有变量,以及如何将自己置于记忆中。
所以我的问题是如何弄清楚或在屏幕上打印实模式中断表?
和/或如果有人有任何好的代码示例,要么禁用某些键或在某些键上发出蜂鸣声,我真的很感激。
谢谢!
答案 0 :(得分:4)
在16位实模式下,中断表从地址0开始,具有256个4字节条目。 256个中断向量中的每一个在该表中获得4字节地址(段+偏移)。
http://en.wikipedia.org/wiki/Interrupt_descriptor_table有更多细节。
答案 1 :(得分:2)
如果您的程序在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