Umlenkung der Unterbrechungen 8086 Allgemeine Begriffe Die 8086er Systeme haben eine Anzahl von 256 Unterbrechungen. Jede Unterbrechung hat eine Rutine beigelegt, welche bei der Erscheinung der Unterbrechung ausgeführt wird. Es sind nicht alle 256 Unterbrechungen definiert. Das grösste Teil der BIOS Unterbrechungen sind beim Starten des Systems initialisiert. Beim Laden des Betriebystems, diese definiert/definiert neu, einige Unterbrechungen, um seine speziellen Systemdatenleistungen zu versichern. (z.B. Dos schreibt die Rutine der Unterbrechung 21h wieder, um der Dos spezifischen Dienstleistungen zu implementieren). Die Rutinen einiger Soft Unterbrechungen (BIOS und Dos) können auf verschiedener Weise die generierte Unterbrechung behandeln, was von einem spezifizierten Wert in einem Register abhängt. Man sagt, die bezügliche Unterbrechung bietet mehrere "Dienstleistungen", oder "Funktionen", an. Man hat eine beschränkte Anzahl von Unterbrechungen und eine grosse Anzahl von Rutienen, welche implementiert werden müssen, so benützen die Anwendungen die folgende Konvention: - beim Aufruf, wird im Register Ah die Nummer der benützten Funktion gelegt. - in den übriggebliebenen Registern legt man die Parameter, die für die Ausführung der bezüglichen Funktion nötig sind. (siehe NG) - Die Rutine zur Behandlung der Unterbrechung überprüft bei jedem Aufruf, die Nummer der Funktion, welche aufgerufen soll, und übergibt die Kontrolle dieser Rutine. Umlenkung der Unterbrechungen Um die Eingangspunkte der 256 Unterbrechungen zu speichern, sind die Adressen des Speichers von 0000h:0000h=>0000h: 0400h (exklusiv) verwendet. Die Adresse einer Unterbrechungshandler besteht aus: -Segmentadresse auf 16 Bits -Offsetadresse auf 16 Bits. Folglich hat die Adresse einer Unterbrechunghandler 2*16=32 Bits nötig (2 Worter=4 Oktette), um gespeichert werden zu können. Um 256 Adressen zu speichern sind 1024 Oktette nötig, also genau der Speicherplatz von 0000:0000 bis 0000:04000. Um ein Handler umzulenken genügt es, im Speicherplatz, wo sein Eingangpunkt gespeichert ist, die Adresse des neuen Eingangspunktes für den bezüglichen Handler zu legen. Bsp1: Um die Unterbrechung 10h (Video Funktionen) mit einem von uns geschreibenen Handler umzulenken, werden die folgenede Adressen gespeichert: 0000:[4*10h+2]=> Segmentadresse des neuen Handlers 0000:[4*10h]=> Offset des Handlers. Gleich nach der Speicherung der Adresse des neuen Handlers, wird die Kontrolle diesem zugewiesen, jedesmal wenn ein Aufruf der Unterbrechung 10h generiert wird. Im allgemeinen hat die Umlenkung einer Unterbrechung als Folge: - die Speicherung der Adresse des alten Handlers in einer Speicherzone. - die Einstellung der Adresse des neuen Handlers fur die Unterbrechung Das Dos System hat 2 Fuktionen, womit man nach der Adresse eines Handlers fragen kann (siehe int 21h, Funktion 35h), bzw. die Adresse eines neuen Unterbrechungsvektors Einstellen kann (int 21h, Funktion 25h ). Bsp2: Um die Adresse des Handlers der Unterbrechung 10h wiederzubekommen, und um sie zu einem neuen Benutzershandler umzulenken: ... Addr_int10 dd ? ... mov ah,3510h int 21h ;legt in ES:BX die Adresse des originellen Handlers ;wir speichern die Adresse des originellen Handlers mov word ptr [addr-int10+2], ES mov word ptr [addr_int10], BX ;wir installieren das neue Unterbrechungshandler mov ax, 2510h ;man nimmt an, dass das neue Handler im aktuellen Kodsegment ist ;(Vom Benutzer geschriebene Rutine) mov ax, cs mov ds, ax mov dx, offset int 21h ;das neue Unterbrechungshandler ist eingestellt Um eine Dos-Unterbrechumgshandler schreiben zu konnen, welches richtig funktioniert, ist es notwendig das Folgende zu wissen: - Der Aufruf eines Unterbechungshandlers kann im jedwelchen Moment beim Ausführung eines Porgramm eintreten (noch mehr wenn es die Rede von SystemUnterbrechungen ist, wie die Zeitunterbrechung 08h oder Tastaturunterbr 09h, usw). Folglich ist es nötig, dass diese eine möglichst kurze Ausführungszeit hat, um das unterbrochene Porgramm nicht zu stören. Ein Handler darf ebenso den Stapel und Datenzonen eines Programms nicht zerstören. - Die Registerwerte sollen behalten (gespeichert) werden, damit wenn der Handler mit der Ausführung fertig ist, das unterbrochene Programm normal weiterlaufen kann. - Beim Eintritt der RBU ist die benüzte Stapel der Stapel des unterbrochenen Programms. Der Handler wird infolge den Stapel des unterbrochenen Programms benützen. Im Fall wenn der Kode des Handlers viel Speicherplatz benötigt, ist es möglich die maximale Dimension des Stapels zu überschreiten und den Inhalt des Stapels zu zerstören. In diesem Fall wird eine eigene Stapel vereinbart. - Es ist nötig den Fall, in welchem der Unterbrechungshandler wiederaufgerufen ist, anzusehen, in der Zeit wo es sich noch unter Behandlung eines vorheigen Geschehens befindet => der Handler unterbricht sich selber. Es ist nötig den ganzen Kontext zu speichern, um die Ausführung wieder aufnehmen zu können (dem Handler spezifische lokale Variablen). - die Unterbrechung 21h (Dos Funktionen) ist nicht "reentrant" => wenn ein Porgarmm inmitten eines Dos funktionsaufrufs unertbrochen ist, und wenn unser Handler ruft auch noch Dos Funkitonen auf, wird das zum Blokieren des Systems führen. Die Unterbrechung 21h ist nicht reentrant weil man einen eigenen statischen Stapel benützt. Die Unterbrechung führt also zur Zerstöhrung des Inhaltes des Stapels für die unterbrochene Dos Funktion. - Im Fall, wenn die Umlenkung nur für dazugeben von Funktionalität oder Modifizierung einer der Unterbrechungsfunktionen gemacht wird, wird auch der originelle Handler aufgerufen, um die Falle zu behandeln, welche unser Handler nicht in Acht nimmt. - Beim Enden des Porgaramms (ausser dem Fall, wenn diese im Speicher residnet bleibt) ist es notwendig die Unterbrechungsvektoren, welche verändert wurden wiederherzustellen. Im entgegengesetzen Fall wird das Betriebsystem weiterhin den Handler, dessen Speicherzone nicht mehr reserviert ist, aufrufen, und dass wahrscheinlich beim nächsten Ausführung eines Programms modifiziert ist. Die Folge ist das Einfrieren (Hängenbleiben) des Systems, wegen der Zulassung der Kontrolle einer ungültigen Speicherzone. Weiterhin siehe Lab4-> Unterbrechungen 8086