在16位实模式下改变中断

时间:2009-10-23 19:49:01

标签: assembly x86 16-bit real-mode

我正在尝试更改我的中断表以接管键盘中断。我的最终目标是编写新的中断例程,将自己复制到RAM中并使实模式中断表指向我。

我在网上找到了随机sample code,但是没有解释如何获取原始中断的地址。他们只是在他们的位置有变量,以及如何将自己置于记忆中。

所以我的问题是如何弄清楚或在屏幕上打印实模式中断表?

和/或如果有人有任何好的代码示例,要么禁用某些键或在某些键上发出蜂鸣声,我真的很感激。

谢谢!

2 个答案:

答案 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