需要帮助在MS-DOS中挂钩新的键盘中断

时间:2013-11-04 11:28:06

标签: assembly dos x86-16 interrupt-handling keyboardinterrupt

我正在为装配班做作业。

我之前设法让我的计时器中断显示,并在每次滴答时更新'时钟'。

我正在尝试使用这些知识来替换我的键盘中断。但即使我注释掉新键盘中断处理程序的安装,我的程序干扰了MS-DOS活动(即无法运行任何可执行文件,只能使用'dir','cd'和类似命令):

.model tiny
.8086
.code
        org 100h
start:
        jmp setup

new_key PROC
        jmp cs: old_key
new_key ENDP

setup:
        mov ax, cs
        mov ds, ax

        old_key DD 00000000h

        MOV    AL, 9h                 ;+-
        MOV    AH, 35h                  ;| Save old_key
        INT    21h                     ;|
        MOV    WORD PTR [old_key],BX
        MOV    WORD PTR [old_key][2],ES


        ; cli   
        ; PUSH   CS                      ;| Install new_key
        ; POP    DS                      ;|
        ; LEA    DX, new_key
        ; MOV    AL, 9h
        ; MOV    AH, 25h
        ; INT    21h


        cli
        push ds
        LDS    DX,CS:[old_key]         ;+- 
        MOV    AL, 9h                  ;| Disinstall new_key
        MOV    AH, 25h                  ;| 
        INT    21h
        POP    DS
        STI   


        mov ax, TSR
        int CALLDOS

end start

由于即使我已经注释掉安装也存在问题,我认为问题在于卸载或old_key保存。我不知道出了什么问题;不应该安装和卸载代码基本上类似于计时器中断的安装/卸载代码吗?

非常感谢您的帮助,谢谢您。

1 个答案:

答案 0 :(得分:1)

    mov ds, ax

    old_key DD 00000000h

    MOV    AL, 9h                 ;+-

你不应该像这样混合代码和数据。 CPU不知道old_key不是代码,因此很乐意尝试执行它。将变量移动到setup标签之前,或插入跳转指令以跳过它。