2013-02-27 21 views
1

我在爲TSR製作TSR com文件時遇到了麻煩。它應該在第21箇中斷處設置一個新的處理程序,終止並保持常駐。新的處理程序應該將控制權轉移給舊的中斷21h處理程序。我保存它的中斷向量,但不知道如何正確調用它。這裏是一個程序:在DOS上組裝(TASM),在int 21h上使用新的處理程序創建TSR

.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

哪個DOS的版本? – 2013-02-27 18:43:39

+0

使用dosbox與DOS v.5.00 – gukoff 2013-02-27 18:48:52

回答

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 

下面的答案几乎是吧:)

1

我的16位DOS ASM是一個有點生疏,但如果我沒有記錯,你需要這樣做:

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

請注意,這是一個跳轉到舊的處理程序 - 控制不會返回到您的鉤子,但直接到原來的調用者(如果你保持堆棧完好無損 - 如果不是它可能會炸燬,而不是:) – 2013-02-27 19:03:33

+0

它在你的DOS上工作嗎?當我使用這個時,dosbox會在第一次int 21h後凍結。我的程序一般是否正確?堆棧保持完好。 – gukoff 2013-02-27 19:17:42

+0

不幸的是,我實際上沒有一個可用的工作環境,我可以在其上進行16位DOS開發。當我執行DOS ISR/TSR的工作時,我已經擁有了像SoftICE一樣的東西來幫助當事情發展到南方時,他們經常這樣做 - 這些東西並不容易得到正確的解決。 – 2013-02-27 19:24:48