Interrupt-System


Es stellt sich natürlich sofort die Frage, wozu brauche ich, wenn ich nur Text ausgeben will das Interrupt-System?
Wir wollen zunächst einmal die Frage klären, was Interrrupt ist.
Generell versteht man darunter eine Unterbrechung des laufenden Programm, ausgelöst durch ein Ereignis im Rechnersystem, aber so, dass nach Behebung des mit dem Ereignis gemeldeten Problems, das unterbrochene Programm fortgesetz wird!
Üblicher Weise löst die Hardware solche Signale aus (z.B. Batterie-Spannung am Laptop ist zu klein). Wir wollen zunächst grob den Bearbeitungsablauf beschreiben.

    Der 8086 hat 2 Interrupt-Eingänge, das sind 1 Bit Leitungen, damit kann man nur feststellen, dass es einen Interrupt gibt, von wem muss man ermitteln.
Interrupte werden ausgelöst, wenn es Probleme gibt - man sollte so schnell wie möglich darauf reagieren. Um schnell zu sein, wurde ein spezieller Interrupt-Baustein entwickelt, der PIC (programmierbarer Interrupt-Controller). Der PIC hat acht 1Bit Eingänge. Nach den Eingängen folgt jeweils ein programmierbares Adressenregister, man nennt die Adresse Interrupt-Vektor. Die Eingänge haben Prioritäten, 0 höchste Priorität.
Wird an einem Eingang ein Ereignis angezeigt (Bit = 1), steht zum Bus eine Adresse bereit und der PIC meldet dem 8086 über Leitung "int" das INTR Signal (Interrupt-Request (1Bit)). Kann der 8086 einen Interrupt annehmen, meldet er INTA zurück (Interrupt-Acknowledge). Nun legt der PIC die Adresse auf den Bus, aus der die Adresse für die Interrupt-Behandlungsroutine ermittelt wird (Interrupt-Service-Routine bzw. ISR). Die Ermittlung der ISR-Adresse erfolgt über die Interrupt-Vektor-Tabelle aus dem Hauptspeicher. Jede Adresse belegt 4 Byte: 2 Byte CS und 2 Byte IP, also die erste Adresse ist 0, die zweite 4.
Auch intern greift der 8086 auf diese Tabelle zu, in der stehen auf der entsprechenden Speicherplatz-Nr. die realen Adressen der ISR und je kleiner die Nr. um so höher die Priorität. Sollte z.B. die ALU eine Division durch 0 ausführen, wird intern auch ein Interrupt mit der ISR von Speicherplatz 0 ausgeführt, die Division durch Null hat also im System die höchste Priorität!

Kurz noch ein Wort zur anderen Interruptleitung. Sie hat die Bezeichnung "nmi", bedeutet nichtmaskierbarer Interrupt, das bedeutet der 8086 kann diesen nicht ablehnen. Er greift sofort auf den Speicherplatz 2 der Interrupt-Tabelle zu und führt sofort die an der Stelle stehende Adresse der ISR aus.
Man spart also ein paar Schritte, es geht noch schneller, braucht man z.B. für Netzausfall.

Bisher haben wir 3 Varianten zur Nutzung des Interruptsystems gezeigt:


Das System nutzt diesen Mechanismus aber noch völlig andersartig

Um das zu verstehen, müssen wir uns kurz mit dem DOS-Betriebssystem beschäftigen.

Betriebssystem ist Software. Die Software besteht aus mehreren Teilprogrammen (Funktionen) die für die jeweilige Aktion von einem Verteiler aufgerufen werden.
Bei MS-DOS besteht das Betriebssystem aus 2 Schichten, dem DOS (Disk Operating System) und dem BIOS (Basic Input/Output System).
Im BIOS befinden sich Routinen die entsprechend eines Protokolls die Kommunikation mit den externen Geräten wahrnehmen. Im DOS hingegen wird die Kommunikation auf logischer Ebene durchgeführt.
Z.B. es soll auf dem Bildschirm ein Text ausgegeben werden - im DOS wird nur die Startadresse des Textes angewiesen und die Anweisung, dass das ausgegeben werden soll.
Die reine Ausgabe übernimmt dann das BIOS, hier wird der Kursor an die entsprechende Position gestellt, bedeutet, dass eine entsprechende Adresse ermittelt wird, Zeichen ausgeben wird, nächstes Zeichen und Speicherplatz ermittel wird, die Endekennung des Textes gesucht und die Freimeldung zurückgegeben wird, dass das Gerät für eine neue Ausgabe bereit ist (und vieles mehr).
Die DOS-Funktionen erfüllen größere Aufgaben, sind aber wenig steuerbar. Die BIOS-Funktionen erfüllen nur kleine Aufgaben, sind aber umfangreicher steuerbar.
Über DOS gibt es noch einen Commander, der Befehle für die Kommandozeilen-Steuerung bereitstellt, auch können mit diesen Befehlen Batch-Dateien geschrieben werden. Genau genommen ist der Commander bereits ein Stück Anwenderprogramm.

Oben wurde schon mal das Wort Verteiler genutzt - und das ist genau die Verbindung zum Interrupt-System. Der 8086 verfügt über einen Befehl INT Nr. Die Abarbeitung des Befehls erfolgt als wenn ein Interrupt von außen aufgetreten wäre. Die Nr. ist die Adresse in der Interrupt-Tabelle. Die Betriebssystem-Funktionen werden nun wie eine Interrupt-Service-Routine (ISR) behandelt. Über diese Möglichkeit kann nun aber auch jeder Assembler-Programmierer auf die Betriebssystem-Funktionen zugreifen.
Man bezeichnet diese Interrupte auch als synchron oder auch als Software-Interrupt, da sie genau zu einer definierten Zeit von der Software ausgelöst werden. Die anderen sind die asynchronen, man weiß nie wann es passiert, oder auch Hardware-Interrupte.
Interessant ist nun, das auch Hardware-Interrupte durch Software ausgelöst werden können. Also wird folgender Befehl geschrieben:
    INT 0
dann meldet das System einen Divisionsfehler- irre! Aber so wird auch ein Hardcopy des Bildschirmes organisiert - ist auch ein Interrupt. Und man kann so ganz einfach eine Bildschirmausgabe eines Textes organisieren.
Die BIOS aufrufende Interrupte, man bezeichnet sie als BIOS-Interrupt, diese haben vorrangig die Adresse 10h (es gibt da noch eine weitere Unterteilung), die DOS-Interrupte 21h, noch einmal, das sind Adressen in der Interrupt-Service-Tabelle.

So sieht z.B. die Textausgabe auf dem Bildschirm über eine DOS-Funktion aus:

Da der Interrupt 21h mehrere Möglichkeiten anbietet, wird hier die Funktion 9 ausgewählt. Die muss vor dem Aufruf ins Register AH transportiert werden und vom Datensegment DS muss über DX die Adresse des Textes, der ausgegeben werden soll, bereitgestellt werden. Dann wird der Interrupt 21h aktiviert.
Wo und in welcher Farbe der Text auf dem Bildschirm ausgegeben werden soll, ist nicht festlegbar, der Text erschein an der aktuellen Kursorposition. Will man das alles auch noch steuern, muss man zuvor eine Reihe BIOS-Funktionen ausgeführt haben - da scheint eine Menge Arbeit auf uns zu zukommen!
Beim Prozessor "ERNA" hatten wir schon für die Ausgabe in eine Zeile einigen Aufwand, nun haben wir den ganzen Bildschirm, der Aufwand wird nicht weniger.

In einer Power-Point Präsentation wird noch einmal für das 8086-System die Abarbeitung eines Interruptes dargestellt.

Im Folgenden noch einmal eine andere, auf die Adressen bezogene, Darstellung der Interruptbearbeitung:

Links ist symbolisch der PIC dargestellt. An die 8 Eingänge werden Leitungen angeschlossen, interne vom System, aber auch solche die von außen kommen. Mit jedem Eingang ist ein 8Bit Register verbunden, diese können programmiert werden.
Nun gibt es folgendes Problem:
Mit 8Bit kann man einen maximalen Wert von 255 erreichen. Nun muss man beachten, dass man um jeden Speicherplatz im Hauptspeicher addressieren zu können, in dem System eine Segmentadresse und einen Zeiger in dem Segment braucht. Das bedeutet, dass zum Erreichen einer beliebigen Adresse also 32Bit also 2 Worte gebraucht werden. Das sind auf den Speicher bezogen 4 Byte. das bedeutet, dass die Adressen immer im Abstand von 4 Byte stehen müssen.
Um das zu erreichen wird das Byte aus dem PIC mit 4 multipliziert bzw. 2 mal nach links geschoben. Aus 255 bzw. 11111111 wird 1111111100 bzw. 3FC(h). Von da an 4 Byte weiter erreicht man die Adresse 400(h), das ist die erste Adresse, die nicht durchs Interruptsystem genutzt wird (nicht werden kann!), das sind (dez) genau 1KByte!
Im Beispiel wurde die Leitung 4 mit 11111101 (FD(h)) belegt, daraus wird als Adresse für die Interrupt-Tabelle die Adresse 1111110100 (3F4(h)) berechnet.
Dort auf dem Speicherplatz steht das lo-Byte von Offset, auf 3F5(h) das hi-Byte vom Offset, auf 3F6(h) das lo-Byte vom Codesegment und auf 3F7(h) das hi-Byte.
Aus diesen Werten wird nach bekanntem Verfahren die Adresse der ISR berechnet:
Code-Segmant * 16 + Offset.

Ohne es zu beschönigen, das Verfahren sieht sehr kompliziert aus - stimmt, aber es bietet viele Variationsmöglichkeiten. Beispielweise bietet das System so die Möglichkeit, einen anderen Drucker zu nutzen. Der Drucker hat die selbe Adresse in der Interrupt-Tabelle, da aber schreibt man eine andere Adresse für die ISR ein. Man kann auch diese Adresse lassen und tauscht nur die ISR aus. In der erste Variante stehen nun beide ISR noch im Rechner.
Man kann natürlich auch die Adresse im PIC ändern. Aufpassen muss man, dass im PIC ein Interrupt eine höhere Priorität hat als ein anderer und dann in der Tabelle die Prioritäten genau anders herum gesetzt werden, diese Interrupte könnten dann das System blockieren!

Als nächstes wollen wir uns kurz spezielle Eigenschaften des Assemblers ansehen. Weitere Informationen zum Assembler sollen bei den Programmbeispielen gegeben werden, bzw. muss man in der Beschreibung des Assemblers nachlesen.

zurück zur Start-Seite   /   weiter Assemblers