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 に答える