Assembly 挂钩Int 09h中断

Assembly 挂钩Int 09h中断,assembly,nasm,dos,x86-16,Assembly,Nasm,Dos,X86 16,我挂接int 09h时遇到问题我更改了指向新Isr的指针,如果我在windows上调试,则每次按键时都会触发中断。但在VMWare中,它似乎只触发一次,不再触发。我在DOS6.22中进行了测试,结果完全相同 我的代码如下所示: MyIsr: pusha pushf ;tell PIC that interrupt has finished mov al,0x20 out 0x20,al popf popa iret 如果我使用U

我挂接int 09h时遇到问题我更改了指向新Isr的指针,如果我在windows上调试,则每次按键时都会触发中断。但在VMWare中,它似乎只触发一次,不再触发。我在DOS6.22中进行了测试,结果完全相同

我的代码如下所示:

MyIsr:
    pusha
    pushf
    ;tell PIC that interrupt has finished
    mov al,0x20
    out 0x20,al
    popf
    popa
    iret


如果我使用USB键盘,我可以发送与Ps/2相同的命令吗?

这里可能有很多问题,因为您尚未发布您正在编写的代码的完整视图。你能确切地解释一下你要完成什么吗

如果ISR被调用而未被处理,您将无法执行任何操作,因此请记住这一点。您的问题可能与如何在中断向量表中安装ISR有关

  • 在实数模式下,使用INT 21h,AH=25h进行此操作
  • 在受保护模式下,在DJGPP下,您需要使用DPMI函数(可以使用INT 21H函数,也可以使用C函数。请参阅
  • 在PM中运行时,还需要锁定ISR的内存,因为内存可能会被“调出”(ISR需要这样做,因为我们并不真正“知道”它何时运行)
无论如何,您的ISR应该更像以下内容:

newInt9:

enter 0,0
push eax

in al, 60h
mov [raw_key], al

mov al, 20h
out 20h, al

pop eax
leave
iret     

;endproc

在覆盖之前,请尝试保存IVT中的上一个ISR指针,并从ISR调用它,而不是确认IRQ。在调用之前请记住按F键:调用旧指针(以模拟int调用)。如果我使用USB键盘,我可以发送与Ps/2相同的命令吗?如果你不从键盘读取键(从端口0x60输入)当键盘中断发生时,您将不会收到来自键盘的进一步中断。在您显示的代码中,您不会从键盘端口进行任何读取。嗯,我正在尝试获取按下的键。我正在实模式MS-DOS 6.22下工作。另一件事是,我使用的USB键盘启用了传统支持。在我最初的功能中,我没有输入并离开堆栈帧。我将使用PS/2键盘测试agian,并告诉您结果