2013-02-27 1 views
1

J'ai un problème avec le fichier TSR com pour DOS. Il devrait définir un nouveau gestionnaire sur une interruption 21 ', se terminer et rester résident. Le nouveau gestionnaire doit transférer le contrôle à un ancien gestionnaire d'interruption 21h. Je sauvegarde son vecteur d'interruption, mais je n'ai aucune idée de comment l'appeler correctement. Voici un programme:Assemblage sous DOS (TASM), création de TSR avec un nouveau gestionnaire sur int 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

Quelle version de DOS? –

+0

Utilisation de dosbox avec DOS v.5.00 – gukoff

Répondre

1

Je compris le problème. La bonne solution est ici. "Right" n'est pas sûr "optimal", mais fonctionne bien de toute façon, et il n'est pas assez difficile d'optimiser ce code maintenant.

.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 

La réponse ci-dessous était presque droite :)

1

Mon DOS 16 bits ASM est un peu rouillé, mais si je me souviens bien que vous devez faire ceci:

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

Notez qu'il s'agit d'un saut vers l'ancien gestionnaire - le contrôle ne revient pas à votre hook mais directement à l'appelant d'origine (si vous gardez la pile intacte - sinon il va probablement exploser :) –

+0

Est-ce que ça marche sur votre DOS? Quand je l'utilise, dosbox se bloque après 21h int. Mon programme est-il correct en général? La pile est conservée intacte. – gukoff

+0

Malheureusement, je ne dispose pas d'un environnement de travail sur lequel je pourrais faire du développement DOS 16 bits. À l'époque où je travaillais DOS ISR/TSR, j'avais des choses comme SoftICE à ma disposition pour aider quand les choses allaient dans le Sud, ce qu'elles faisaient souvent - ce genre de choses n'est pas facile à faire. –

Questions connexes