0

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

我以前设法让我的定时器中断显示并在每个滴答声中更新一个“时钟”。

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

协助将不胜感激,在此先感谢您。

4

1 回答 1

1
    mov ds, ax

    old_key DD 00000000h

    MOV    AL, 9h                 ;+-

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

于 2013-11-04T12:05:11.693 回答