← TOS 01 / 1991

Ausnahmezustand: Die Exceptions der 68000-Familie

Programmieren

Ob Pilze, Bomben oder »unvorhergesehene FĂ€lle« aller Art — jeder Benutzer ist bereits mit ihnen in BerĂŒhrung gekommen« Diese ungemĂŒtlichen Gesellen stellen den einzig sichtbaren Teil eines intern ablaufenden Prozesses dar, der im Fachjargon »Exception« heißt.

UnabhĂ€ngig von seinen Peripheriebausteinen kennt der MC 68000 drei unterschiedliche BetriebszustĂ€nde. Im normalen Zustand lĂ€uft alles in geregelten Bahnen, d. h. der Prozessor arbeitet einzelne Befehle nacheinander ab. Tritt eine Exception (Ausnahme) auf, wechselt er sofort in den Supervisor-Modus. Exceptions treten bei Interrupts, dem Trap-Befehl oder bei aktivem Trace-Modus auf. Stolpert der Prozessor ĂŒber einen doppelten Busfehler, ist er nicht in der Lage, diesen zu korrigieren, und stellt augenblicklich seine Arbeit ein. Dieser Zustand (Halt) lĂ€ĂŸt sich auch extern ĂŒber die Halt-Leitung des Prozessors steuern.

Was genau ist eine Exception? Dazu ein Beispiel: Der MC 68000 erlaubt keinen Wort- oder Langwortzugriff auf ungerade Adressen. Der Befehl

move.l #12345678, $f8001

fĂŒhrt folglich zu einem Fehler. Damit der Prozessor weiß, wie er mit der Fehlerbehandlung fortfahren soll, gibt es ab der Speicheradresse $8 eine Tabelle mit sogenannten Exception-Vektoren. Diese Tabelle ist fĂŒr alle GerĂ€te, die einen 68000er benutzen, gleich und enthĂ€lt fĂŒr jede Exception eine Adresse, zu welcher der Prozessor verzweigt. Bei einem Adressfehler (s. o.) liegt dieser Vektor bei $0C. Das Programm an dieser Adresse kĂŒmmert sich um die Ausgabe der Bomben. Neben solchen Fehlern gibt es eine Reihe von Interrupts, Befehlen und Pseudo-Opcodes, die eine Exception auslösen (siehe Tabelle 2).

Bild 1. Bei einem Bus- oder Adreßfehler legt der Prozessor neben dem ProgrammzĂ€hler und dem Statusregister weitere vier Wörter ab

Innerhalb des Prozessors geschieht jedoch eine ganze Menge mehr. Je nach Art der Exception legt er eine Reihe von Informationen auf den Stack. Bei einer Exception aus Gruppe 2 und 3 sind dies nacheinander der ProgrammzĂ€hler sowie das Statusregister. Nach dem »LIFO«-Prinzip (»last in, first out«) befindet sich der ProgrammzĂ€hler nach diesem Vorgang in 2(sp). Dieser zeigt bei Trace und Interrupt auf den nĂ€chsten auszufĂŒhrenden Befehl, bei allen anderen Exceptions der Gruppe 1 und 2 auf den durch die Exception abgebrochenen Befehl. Tritt ein Bus- oder Adreßfehler auf, wandern mehr Informationen auf den Stack (siehe Bild 1). Neben den erwĂ€hnten Informationen legt der Prozessor ein Super-Statuswort (vgl. Tabelle 1), die Zugriffsadresse und den Maschinencode des zuletzt abgearbeiteten Befehls auf den Stack.

Bild 2. Tritt eine Exception auf, folgt der Prozessor stets dem gleichen Schema. Lediglich das Exception-Programm darf der Programmierer nach Belieben verÀndern.

Bild 2 zeigt ein Flußdiagramm einer Exception. ZunĂ€chst sichert der Prozessor das Statusregister intern. War ein Interrupt Auslöser fĂŒr eine Exception, wird die Interrupt-Maske im Statusregister angeglichen. Anhand der fĂŒr jede Exception unterschiedlichen Vektornummer bestimmt der Prozessor die entsprechende Adresse in der Vektortabelle und rettet wie oben beschrieben wichtige Daten auf den Stack. Abschliessend lĂ€dt er den ProgrammzĂ€hler mit dem Inhalt der Vektor-Adresse und fĂŒhrt das an dieser Stelle befindliche Programm aus. Wichtig: Dieses Programm enthĂ€lt als letzte Zeile den Befehl »RTE« (return from exception). Soll der unterbrochene Prozeß nach der Exception verlassen werden (z. B. bei Bus- oder Adreßfehlern), beendet die Funktion »Pterm0« das Exception-Programm. Als Anwendungsbeispiel finden Sie einen Mini-Debugger auf der TOS-Disk im Archiv »Buggy«. Dieses Programm ersetzt die TOS-interne Fehlerdarstellung (Bomben) und gibt weiterfĂŒhrende Informationen zum aufgetretenen Fehler.

Literatur: Jankowski, Reschke, Rabich - Atari ST Profibuch; Sybex; Hilf, Nausch - Die M68000 Familie Band 1; tewi

Tabelle 1. Das Super-Statuswort liegt nach einer Exception ganz oben auf dem Stack und enthĂ€lt in den unteren fĂŒnf Bit nĂ€here Informationen ĂŒber den Auslöser.

Bit Bedeutung
0-2 Function-Code Leitungen (FC0-FC2)
3 Ein Befehl oder eine Exception der Gruppe 1 oder 2 (Bit gesetzt) bzw. der Gruppe 3 (Bit gelöscht) wurde bei Abbruch verarbeitet
4 Lesezyklus (Bit gesetzt) bzw. Schreibzyklus (Bit gelöscht)
Gruppe Exeption
1 Reset Adress-Fehler Bus-Fehler
2 Trace (Bit im Statusregister) Interrupt Opcodes ($Axxx,$Fxxx) Privilegverletzung
3 TRAP, TRAPV, CHK, Division durch null

Tabelle 2. Treten mehrere Exceptions gleichzeitig auf, entscheidet deren PrioritĂ€t ĂŒber die Reihenfolge der AusfĂŒhrung. Gruppe 1 besitzt die höchste PrioritĂ€t.

Armin Hierstetter