1

DOS 用の TSR com ファイルの作成に問題があります。21 番目の割り込みで新しいハンドラを設定し、終了して常駐する必要があります。新しいハンドラーは、制御を古い割り込み 21h ハンドラーに転送する必要があります。割り込みベクトルを保存しましたが、正しく呼び出す方法がわかりません。ここにプログラムがあります:

.model tiny
.data
    old_int21h dw ?, ?
.code
org 100h
start:

    ;saving old interrupt vector
    mov ax, 3521h
    int 21h
    mov [old_int21h], bx
    mov [old_int21h + 2], es

    ;setting new interrupt vector
    cli
    push ds
    push cs
    pop ds
    lea dx, myint21h
    mov ax, 2521h
    int 21h
    pop ds
    sti

    ; TSR
    lea dx, start
    int 27h

myint21h proc
    ; doing something
    ; want to transfer control to an old interrupt 21h handler here. How?
    iret
myint21h endp

end start
4

3 に答える 3

2

私は問題を理解しました。正しい解決策はここにあります。「正しい」は「最適」かどうかはわかりませんが、とにかくうまく機能し、このコードを最適化するのは難しいことではありません。

.model tiny
.code
org 100h
start:

    ; saving old interrupt vector
    mov ax, 3521h
    int 21h
    mov [old_int21h], bx
    mov [old_int21h + 2], es

    ; setting new interrupt vector
    cli
    push ds
    push cs
    pop ds
    lea dx, myint21h
    mov ax, 2521h
    int 21h
    pop ds
    sti

    ; TSR
    mov dx, 00ffh
    mov ax, 3100h
    int 21h

    ; here comes data & hew handler part
    old_int21h dw ?, ?

    myint21h proc
                    ; some stuff
                    ; transfer control to an old interrupt 21h handler
        push word ptr [cs:old_int21h + 2] ; segment
        push word ptr [cs:old_int21h]     ; offset
        retf
    myint21h endp

end start

以下の答えはほぼ正しかった:)

于 2013-03-01T05:18:12.707 に答える
1

私の 16 ビット DOS ASM は少し錆びていますが、私の記憶が正しければ、次のようにする必要があります。

push word ptr [old_int21h + 2] ; segment
push word ptr [old_int21h]     ; offset
retf
于 2013-02-27T19:01:23.730 に答える