2016-07-24 25 views
-2

Ich versuche zum Erstellen eigenen unterbrechen ... für int 40h, int 42h, int 45h.i das Vektor-Design erstellt hat, aber nach der Anweisung IRET nennt es Fehler ist zeigt, die Anweisung noch nicht definiert wird ... wie sie beheben diese ...warum Interrupt-Routine nicht stoppt?

ich versuche, Subtraktion, Division und Multiplikation hinzufügen, um den Interrupt mit i bisher versucht:

code segment 
    assume cs:code,ds:code 
    org 1000h 

    mov ax,0000h 
    mov ds,ax 





    mov bx,40h*4 
    mov ax,offset add 
    mov word ptr [bx],ax 
    mov dx,0 
    mov word ptr[bx+2],dx 




    mov bx,42*4 
    mov ax,offset sub 
    mov word ptr [bx],ax 
    mov dx,0 
    mov word ptr[bx+2],dx 


    mov bx,45*4 
    mov ax,offset div 
    mov word ptr [bx],ax 
    mov dx,0 
    mov word ptr[bx+2],dx 


    mov bx,48*4 
    mov ax,offset mul 
    mov word ptr [bx],ax 
    mov dx,0 
    mov word ptr[bx+2],dx 



    mov cx, 01h; 

    cmp cx, 01h 
    jz 40hh 

    cmp cx, 02h 
    jz 42hhh 

    cmp cx, 03h 
    jz 45hhh 

    cmp cx, 04h 
    jz 48hhh 




    40hh: 
    int 40h 



    42hhh: 
    int 42h 



    45hhh: 
    int 45h 


    48hhh: 
    int 48h 





    add: 
    mov dl,40h 
    mov dh,30h 
    add dh,dl 
    iret 


    sub: 
    mov dl,40h 
    mov dh,30h 
    sub dl,dh 
    iret 

    mul:  
    mov al,4h 
    mov bh,3h 
    mul bh 
    iret 

    div: 
    mov ax,40h 
    mov cx,05h 
    div cx 
    iret 



     e: ret 

    int 21h 
+2

Ich habe nicht die Energie haben, um zu versuchen, dieses Problem zu beheben, aber Sie tun müssen, mehr als du in den Interrupts selbst machst. Werfen Sie einen Blick auf eine gute grundlegende Referenz auf DOS-basierte Assembly und Interrupt-Hooking –

+1

Außerdem fallen Sie gerade durch Ihre vermeintlichen Interrupt-Handler, wie Ihr Code endet, was eine schreckliche Idee ist. –

+1

kommentieren Sie Ihren Code. Verwenden Sie außerdem einen Debugger, um einen Einzelschritt durchzuführen. Das ist kein [mcve]; es könnte viel kürzer sein. –

Antwort

1

Vor allem die PSP 256 (100h) Bytes lang, nicht 4 kB (1000h).
Ersetzen Sie also ORG 1000h durch ORG 100h.

Zweitens, können Sie nicht Annahme über das Segment machen Ihr Programm in geladen wird, einmal in Erinnerung.
Eigentlich können Sie eine machen: Es wird nicht sicherlich in Segment 0 geladen werden, weil das Segment einen bereits überfüllten Anfang hat.
Aber Sie tun, um diesen

mov dx,0 
mov word ptr[bx+2],dx 

der das Segment Teil des far-Zeigers in dem IVT-Eintrag auf Null gesetzt, so dass unter der Annahme, dass add, sub, mul und div in dem Segment Null.
Ersetzen Sie mov dx,0 durch mov dx, cs.

Schließlich Ihr Code läuft Wild am Ende, alle Anrufe, die durch das Interrupts und der ersten ISR selbst!
Sie können Int 21/AH=4Ch verwenden, um ein Programm zu beenden.
Vor dem Beenden Sie sollen obwohl die ursprüngliche ISRs wiederzuherzustellen.

Hinweis, es gibt einige Code-Gerüche.

Sie richten DS so ein, dass sie auf das Segment Null zeigt, um die IVT-Einträge zu schreiben, es sei denn, Sie werden niemals einen nicht segmentierten Speicherzugriff ausführen.

Der „Schalter“ fehlt die „Pausen“. Jeder Zweig Ihres Programmablaufs wird in den folgenden zusammengeführt (dh ein Sprung zu 40hhh führt auch Code von 42hh aus).

Die div ISR nicht dx vor der div einrichten.

Die ISR sich ziemlich willkürlich sind und sie verprügeln die Register, es sei denn, dies ist nur ein Prototyp ist, werden sie ein Alptraum zu verwenden, in jeder realen Programm.


Wie Sie wissen, da Sie die IVT schreiben, die am Anfang des Segments sitzt 0