0

私は非常に基本的な TSR コードを持っています。「D」キーを入力すると、画面に「E」が表示されます。それ以外は何も表示されません。
私がやりたいことは、「ESC」ボタンを押すと、TSR を削除して元の BIOS ルーチンに戻りたいということです。

org 100h

equ 060h            

EOI            equ 020h         
Master_8259    equ 020h

main:
    call _inst_09

_inst_09:
    cli
    xor     ax, ax
    mov     es, ax
    mov     bx, [es:09h*4]
    mov     [stari_int09_off], bx 
    mov     bx, [es:09h*4+2]
    mov     [stari_int09_seg], bx

    mov     dx, tastatura
    mov     [es:09h*4], dx
    mov     ax, cs
    mov     [es:09h*4+2], ax
    sti

    mov ax,3100h
    mov dx,500
    int 21h
    ret

tastatura:  
    push    ax
    in      al, KBD             ; Ucitati scan_code iz I/O registra tastature  
    mov    [kbdata], al
    cmp byte[kbdata],20h
    je .lup
    mov     al, EOI             ; Kod za End Of Interrupt (EOI)
    out     Master_8259, al     ; Poslati EOI na Master PIC (dozvola novih prekida)
    pop     ax
    iret
.lup:
    mov al,45h
    mov ah,0eh
    int 10h
    mov     al, EOI             
    out     Master_8259, al     
    pop     ax
    iret

stari_int09_seg: dw 0
stari_int09_off: dw 0

kbdata:     db 0                                   

%include "ekran.asm"

変更した割り込みをアンインストールする必要があることはわかっていますが、アンインストールした後、プログラムが応答しなくなりました。
これは、unstaling 手順になります。

_uninst_09:
cli
xor     ax, ax
mov     es, ax
mov     ax, [stari_int09_seg]
mov     [es:09h*4+2], ax
mov     dx, [stari_int09_off]
mov     [es:09h*4], dx
sti
ret

トリックは、どこに置くべきかわからないということです。ESCが押されているかどうかを確認してから、この手順にジャンプしてみましたが、機能していないようです。

4

1 に答える 1

2

すべてのフックされた割り込みベクトルを元の値に復元し、すべてのファイル (存在する場合) を閉じ、DOS から割り当てられたすべての動的メモリ (存在する場合) を解放してから、プログラム領域自体を解放します。TSR が COM ファイルか EXE ファイルかによって、開始アドレスが異なります。COM ファイルの場合、プログラム メモリはファイルの先頭から始まります。EXE ファイルの場合は、もう少し注意が必要です。次に、通常どおり割り込みハンドラーから戻ります。二度と呼び出されることはありません。

DOS メモリを解放するには、割り込み 21h、関数 49h を使用します。

編集:あなたの問題は割り込みハンドラにあります。キーボード入力を正しく処理しないため、フォアグラウンド プロセスでキーボードが壊れます。

ハンドラーで、最初に元の 1 つを呼び出します (それが割り込みハンドラーであるという事実に関して)。

tastatura:  
    push es
    push ax
    mov ax, [stari_int09_seg]
    mov es, ax
    mov ax, [stari_int09_off]
    pushf
    call es:ax

次に、 int 16 を使用してキーボード入力を読み取ります。

于 2014-11-01T15:39:33.497 に答える