x86-Programmierung und -Betriebsarten (Teil 3)

Interrupt-Prozedur

Beim Aufruf eines Interrupt läuft nun folgende Prozedur (siehe Bild "Prozedur" im Abschnitt "Software-Interrupts") ab, die ab dem 80386 automatisch und ohne weiteres Eingreifen eines Programms ausgeführt wird:

  • Die CPU schiebt die EFlags, CS und EIP - in dieser Reihenfolge - auf den Stack (im 16-Bit-Modus natürlich nur Flags, CS und IP).

  • Das Interrupt- und Trap-Flag werden gelöscht.

  • Die CPU adressiert den Interrupt-Vektor in der Interrupt-Vektortabelle entsprechend der Nummer des Interrupt und lädt EIP (oder IP im 16-Bit-Modus) sowie CS aus der Tabelle.

CS:EIP des Interrupt-Vektors gibt den Einsprungpunkt des Interrupt-Handlers an. Damit setzt der Prozessor seine Arbeit mit dem Interrupt-Handler fort. Die Rückkehr zum aufrufenden Programm erfolgt über ein IRET. Beispiel:

INT 10h

Der Prozessor schiebt die aktuellen Flags, CS und EIP auf den Stack, löscht das Interrupt- und Trap-Flag und liest den Interrupt-Vektor an der Adresse 0000:0040. Die zwei Bytes bei 0000:0040 werden in EIP, die beiden Bytes bei 0000:0042 in CS geladen (beachten Sie das INTEL-Format low-high).

Die CPU lädt den Offset-Wert des Handlers im 32-Bit-Modus zwar in EIP, aber der Offset in der Interrupt-Vektortabelle umfasst aus Kompatibilitätsgründen mit den 16-Bit-Vorgängern 8086 und 80286 des 80386 nur 16 Bit. Die zwei höher wertigen Bytes in EIP werden dann einfach mit dem Wert 0000h aufgefüllt.

Von Interesse ist auch die Kodierung des INT-Befehls: 11001100 beziehungsweise 11001101 stellt den Opcode dar, und vvvvvvvv gibt die Nummer des Interrupt an: Der Befehl INT 3 besteht also aus nur einem Byte. Im Abschnitt Exceptions erfahren Sie Näheres zu diesem Interrupt. Für alle anderen INT-Befehle ist nur eine unmittelbare Adressierung möglich, das heißt, die Nummer des Interrupt-Vektors ist Teil des Befehlsstroms. Damit kann die Nummer des Interrupt nicht in einem Register oder Speicheroperanden bereitgehalten werden.

Software-Interrupts treten synchron zur Programmausführung auf, das heißt, jedes Mal, wenn das Programm den Punkt mit dem INT-Befehl erreicht, wird ein Interrupt ausgelöst. Das unterscheidet sie wesentlich von den Hardware-Interrupts und Exceptions.