我在为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
答案 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 ) {
...
}
...
}