Suchen und Finden
Service
Infos und Kontakt
9.7 Aufruf von Interrupt-Routinen (S. 216)
Die Kommunikation eines Programms mit dem Benutzer erfolgt im Wesentlichen über Eingabe- und Ausgabe-Aktionen. Dabei erfolgt die Eingabe meist über die Tastatur, die Ausgabe wird häufig an den Bildschirm oder den Drucker geschickt. In unseren bisherigen Beispielen haben wir hierzu verschiedene Varianten der read- und write- Makros verwendet, die in der Datei macros.mac definiert und in den Programmen durch die Direktive include macros.mac zur Verfügung gestellt wurden. Wie wir wissen, können und müssen wir im Assembler jedes Detail unseres Rechners programmieren. So muss man z.B. für die Ausgabe eines ASCII-Zeichens auf dem Bildschirm einen recht aufwendigen Algorithmus durchlaufen:
• zuerst muss man feststellen, ob das Zeichen tatsächlich auf dem Bildschirm dargestellt werden soll oder ob es ein Steuerzeichen ist,
• anschließend muss man ermitteln, welche Grafikkarte der Rechner hat, um die richtige Anfangsadresse des Bildschirmspeichers zu finden,
• schließlich muss das Zeichen – falls es dargestellt werden soll – an der aktuellen Cursorposition im Bildschirmspeicher abgelegt werden.
Aufgaben wie diese müssen auch vom Betriebssystem MS-DOS an vielen Stellen erledigt werden. Im Betriebssystem sind also etliche Routinen programmiert, die häufig verwendete Standard-Aufgaben verrichten. Diese Routinen stehen auch den Anwender- Programmen zur Verfügung.
Der Zugriff auf die Betriebssystem-Routinen erfolgt allerdings anders als der auf selbst geschriebene Unterprogramme. Die Betriebssystem-Routinen sind durchnumeriert – aus historischen Gründen nicht lückenlos und auch nicht logisch sortiert. Jeder Nummer einer Routine werden an einem absolut festen Speicherbereich, dem Interrupt-Vektor, zwei Worte zugeordnet, in denen die Anfangsadresse der eigentlichen Interrupt-Routine steht. Der Interrupt-Vektor beginnt an der absoluten Adresse 0 und ist 1 KByte lang, da jeder Eintrag 4 Byte = 2 Worte lang ist, kann er also 256 Anfangsadressen solcher Routinen aufnehmen. Diese Betriebssystem-Routinen werden wir im Folgenden Interrupt-Routinen nennen.
Der Name Interrupt (= Unterbrechung) deutet darauf hin, dass hier irgendwie das laufende Programm unterbrochen wird. In der Tat verfügen die Prozessoren Intel 80x86 über ein recht praktisches Interrupt-Konzept, das auf Unterbrechungssignale schnell und sicher reagieren kann. Solche Unterbrechungssignale werden im Normalfall von Peripheriegeräten an den Prozessor gesendet. Wenn z.B. eine Taste der Tastatur gedrückt wird, erhält der Prozessor ein Unterbrechungssignal sowie eine Nummer n. Das löst dann den Start der Interrupt-Routine mit der Nummer n aus. Da jede Adresse im Interrupt-Vektor 4 Byte belegt, wird intern die Zahl n mit 4 multipliziert (bzw. um 2 Stellen nach links geschoben), und man erhält die Anfangsadresse der Speicherstelle, die der Interrupt-Routine mit Nummer n zugeordnet ist. Wie oben erwähnt, steht dort die Anfangsadresse der eigentlichen Interrupt-Routine, an die dann gesprungen wird. Zuvor werden noch automatisch das Status-Register sowie die aktuellen Werte der Register cs und ip auf dem Keller gesichert, damit nach der Rückkehr aus der Interrupt-Routine das Programm ordnungsgemäß fortgesetzt werden kann.
Wenn wir eine Routine des Betriebssystems aus unserem Assembler-Programm aufrufen möchten, müssen wir ebenfalls einen Interrupt auslösen. Dazu gibt es den Befehl int Zahl wobei Zahl die Nummer der gewünschten Interrupt-Routine ist.
Alle Preise verstehen sich inklusive der gesetzlichen MwSt.; Ersparnis im Vergleich zur Printversion









