16位实模式下的中断修改

3
我想更改我的中断表以接管键盘中断。我的最终目标是编写我的新中断例程,将自己复制到RAM中,并使实模式中断表指向我。
我在网上找到了随机的示例代码,但缺少有关如何获取原始中断地址的说明。它们只是用变量代替,以及如何将自己放入内存。
所以我的问题是,如何找出或将实模式中断表打印到屏幕上?
如果有人有任何好的代码示例来禁用某些键或哔哔声,我会非常感激。
谢谢!

这听起来像是一种蠕虫实现! - Nikolaos
5
在任何运行于32位保护模式下的现代平台上,通过这种方法无法向中断描述符表写入信息,因此它不会是一种有效的蠕虫。 - Michael
2个回答

4

这是正确的,但你可以使用LIDT指令重新定位IDT。你可以使用SIDT指令查看IDT的当前位置。在实模式下,结果的[15:0]位保存了IDT基址。你可以使用它来访问相关的中断向量。 - Nathan Fellman
它们是否组织得当,以至于如果我想要 int 16 的地址,它将是 SIDT+(16*4bytes) 的结果?因此,每 4 个字节是下一个顺序中断地址? - Without Me It Just Aweso
@NathanFellman 你谈论的是IDT,它只存在于保护模式下。实模式只有IVT,它是不同的,并且始终位于内存中固定位置,从地址0开始。 - James M. Lay
@JamesM.Lay:我在SDM中没有看到任何阻止您在RM中执行LIDT的内容,也没有看到任何参考资料表明在RM期间矢量化不使用IDT。 - Nathan Fellman
@NathanFellman 是的,这些信息似乎已经失传了。直到英特尔80286推出支持保护模式的市场上第一款x86处理器之前,LIDT才得到支持(该芯片是16位的,因此我们谈论的是16位保护模式。这些日子里没有得到很好的记录)。换句话说,您可以加载IDT,但在进入保护模式之前它将无法正常工作。系统仍将尊重从0x0000:0x0000开始的IVT。 - James M. Lay
显示剩余3条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接