【问题标题】:Need help hooking new keyboard interrupt in MS-DOS需要帮助在 MS-DOS 中挂钩新的键盘中断
【发布时间】:2013-11-04 11:28:06
【问题描述】:

我正在为一个装配班做作业。

我之前已经设法让我的计时器中断显示并在每个滴答时更新一个“时钟”。

我正在尝试使用这些知识来替换我的键盘中断。但即使我注释掉新键盘中断处理程序的安装,我的程序也会干扰 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 保存。但是我不知道出了什么问题;安装和卸载代码不应该本质上类似于定时器中断的安装/卸载代码吗?

我们将不胜感激,在此先感谢您。

【问题讨论】:

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


【解决方案1】:
    mov ds, ax

    old_key DD 00000000h

    MOV    AL, 9h                 ;+-

您不应该这样混合代码和数据。 CPU 不知道old_key 不是代码,所以它会很高兴地尝试执行它。将变量移动到setup 标签之前,或者插入跳转指令跳过它。

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多