在DOS上组装(TASM),在int 21h上创建一个带有新处理程序的TSR

时间:2013-02-27 18:40:40

标签: assembly x86 dos tasm tsr

我在为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

3 个答案:

答案 0 :(得分:1)

我的16位DOS ASM有点生疏,但如果我没记错,你需要这样做:

push word ptr [old_int21h + 2] ; segment
push word ptr [old_int21h]     ; offset
retf

答案 1 :(得分:1)

我明白了这个问题。正确的解决方案就在这里。 “正确”并不确定“最佳”,但无论如何都很好用,现在优化此代码并不够难。

.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

以下答案几乎是正确的:)

答案 2 :(得分:-1)

List<Animal> animals = new ArrayList<>();
animals.add( new Mouse() );
animals.add( new Cat() );
animals.add( new Dog() );

for ( Animal a : animals ) {
    if ( a instanceof Mouse ) {
        ...
    }
    ...
}