; Dieses Programm lenkt die Funktion der Unterbrechung 2Fh um. ; Es ist eigentlich die Unterbrechung umgelenkt, aber das Handler ; behandelt nur die Funktion 00h. Die andere Funktionen sind an ; den originellen Handler übergegeben. assume cs:cseg, ds:cseg cseg segment ; die Adresse des alten Handlers für die Unterbrechung 2Fh oldInt dd ? ; der Text, der am Bildschirm angezeigt wird, wenn die Funktion ; 00h der Unterbrechung 2Fh gerufen wird. message db 'Function 00h der Unterbrechung 2Fh war umgelenkt',10,13,'$' handler proc far ; die Unterbrechungen sind inaktiviert cli ; wir testen ob die gerufene Funktion 00h ist cmp ah, 00h ; wenn nicht, dann wird das originelle Handler gerufen jne orig ; die gerufene Funktion ist 00h ; die Werte der Register, die eventuell verändert werden ; sind gespeichert push ax push bx push dx push ds ; wir stellen ins Register ds die Adresse des Codesegmentes ; die Daten sind hier im Codesegment deklariert [OldInt und message] push cs pop ds ; zeigt den Text von message am Bildschirm mit der Funktion 09h ; der Unterbrechung 21h an mov ah, 09h mov dx, offset message int 21h ; die Werte der veränderten Registern sind zurückgestellt pop ds pop dx pop bx pop ax ; die Unterbrechungen sind wieder erlaubt sti ; Rückkehr vom Unterbrechung-Handler iret orig: ; ruft das originelle Handler durch ein "far" Aufruf [seg]:[offset] call dword ptr cs:[oldInt] sti ; Return far. Wir benützen nicht iret weil das originelle Handler ; das Flag-Register vom Stapel durch iret schon herausgenommen hat ; iret würde hier falsch sein weil er noch ein pop für die Flags ; ausführen würde, diese Werte sind aber nicht mehr ; dort. retf handler endp start: mov ax, cseg mov ds, ax ; gibt die Adresse des originellen Handlers zurück ; AH <- 35h; AL<-2Fh (Nummer der Unterbrechung) mov ax, 352Fh int 21h ; speichert die Adresse des originellen Handlers mov word ptr [oldInt+2], es mov word ptr [oldInt], bx ; die Unterbrechungen sind inaktiviert während die Adresse ; des Handlers verändet wird cli ; neue Adresse des Handlers ist eingestellt ; AH<-25h; Al<-2Fh (Nummer der Unterbrechung) mov ax, 252Fh mov dx, offset handler ; ds ist schon auf der Anfangsadresse von cseg gestellt int 21h sti ; Aufruf der Unterbrechung 2Fh mit Funktion 00h. Es wird unser ; Handler gerufen. mov ah, 00h int 2Fh ; stellt das originelle Handler der Unterbrechung 2Fh zurück mov ax, 252Fh mov dx, word ptr [oldInt] mov bx, word ptr [oldInt+2] mov ds, bx int 21h mov ax,4c00h int 21h cseg ends end start