Assembly 16位实模式下的Alter中断

Assembly 16位实模式下的Alter中断,assembly,x86,16-bit,real-mode,Assembly,X86,16 Bit,Real Mode,我正试图改变我的中断表来接管键盘中断。我的最终目标是编写新的中断例程,将自己复制到RAM中,并使实模式中断表指向我 我在网上找到了random,但它缺少关于如何获取原始中断地址的解释。它们只是在它们的位置上有变量,以及如何将自身放入内存中 所以我的问题是,我如何计算或打印到屏幕上的实模式中断表 和/或如果有人有任何这样做的好代码示例,以禁用某些键或在某些键上发出嘟嘟声,我将非常感谢 谢谢 在16位实模式下,中断表从地址0开始,有256个4字节条目。256个中断向量中的每一个都在该表中获得一个4字

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

我在网上找到了random,但它缺少关于如何获取原始中断地址的解释。它们只是在它们的位置上有变量,以及如何将自身放入内存中

所以我的问题是,我如何计算或打印到屏幕上的实模式中断表

和/或如果有人有任何这样做的好代码示例,以禁用某些键或在某些键上发出嘟嘟声,我将非常感谢


谢谢

在16位实模式下,中断表从地址0开始,有256个4字节条目。256个中断向量中的每一个都在该表中获得一个4字节的地址(段+偏移量)


有一些更详细的信息。

如果您的程序在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

这听起来像是一个蠕虫实现!这不是一个有效的蠕虫,因为在任何以32位保护模式运行的现代平台上,都不能通过此方法写入中断描述符表。这是正确的,但可以使用
LIDT
指令重新定位IDT。您可以使用
SIDT
指令查看IDT的当前位置。在实模式下,结果的位[15:0]保持IDT基址。你可以用它来访问相关的中断向量。它们的组织方式是否可以说我想要int 16的地址,这将是SIDT+(16*4字节)的结果?那么每4个字节就是下一个顺序中断地址?@NathanFellman你说的是IDT,它是受保护模式所独有的。Real mode只有一个IVT,这是不同的,并且总是在内存中的一个固定位置,从地址0开始。@JamesM.Lay:我在SDM中没有看到任何东西阻止您在RM中执行LIDT,也没有看到一个引用说RM期间的矢量化不使用IDT。@NathanFellman是的,这些信息已经有点丢失在历史中了。直到intel 80286才在x86处理器上支持LIDT,intel 80286是市场上第一个支持保护模式的x86处理器(该芯片是16位的,所以我们说的是16位保护模式。这些天没有很好的文档记录)。换句话说,您可以加载IDT,但在进入保护模式之前,IDT将无法正常工作。系统仍将遵守从0x0000:0x0000开始的IVT。