Sprungtabelle
Eine Sprungtabelle (auch Verzweigungstabelle oder Sprungleiste genannt; englisch jump table) ist in der Programmierung eine Methode, bei der eine Verzweigung des Programmflusses durch eine Tabelle von Sprunganweisungen realisiert wird.
Einsatzzwecke
Nutzung für Funktionsaufrufe
Eine Sprungtabelle kann genutzt werden, um eine bestimmte Auswahl von Funktionen (aus einem Betriebssystem oder aus einer Funktionsbibliothek) bequem und kompatibilitätssicher aufrufen zu können. Dazu sind die Aufrufe (oder manchmal auch nur die nackten Funktionsadressen) mit konstanter Länge hintereinander wie in einer Tabelle im Speicher angeordnet. Sie bestehen typischerweise aus einfachen Sprungbefehlen an die Stelle im ROM oder innerhalb der Funktionsbibliothek, wo der eigentliche Programmcode steht. Auf diese Weise werden mehrere Zwecke gleichzeitig erfüllt:
- Man erreicht dadurch Kompatibilität zwischen aufeinanderfolgenden Softwareversionen: Auch wenn sich der eigentliche Code einer oder mehrerer Funktionen verändert und sich die Adresslage der Funktionseinsprünge dadurch ändert, wird nur die Adresse in den Sprungbefehlen der Sprungtabelle geändert, wogegen die Anwendungssoftware, die diese Sprungtabelle benutzt, eben nicht angepasst werden muss.
- Man kann diese Funktionen praktisch über eine Nummer (ihren Index innerhalb der Tabelle) ansprechen, was die Programmierung in bestimmten Bereichen vereinfacht.
Manche Mikroprozessoren unterstützen solche Konstrukte auch durch spezielle Befehle, die solche indizierten Sprünge implementieren.
Switch-Anweisung
Sprungtabellen können auch durch Compiler erzeugt werden, hauptsächlich bei der optimierten Implementierung von Switch-Anweisungen, bei denen die Werte eng zusammen liegen.
Implementierung
Implementierungsprinzip einer Programmbibliothek in 6502-Assembler-Syntax:
Bibliotheksbasis: JMP Funktion0 ; Sprungleiste JMP Funktion1 ; Jede dieser Sprunganweisungen JMP Funktion2 ; belegt genau 3 Bytes im ROM ... JMP Funktionn ... Funktion0: ; Implementierung Funktion 0 ... RTS ; Rücksprung aus Funktionsroutine Funktion1: ; Implementierung Funktion 1 ... RTS ; Rücksprung aus Funktionsroutine ... Funktionn: ; Implementierung Funktion n ... RTS ; Rücksprung aus Funktionsroutine
Aufruf einer Funktion n aus so einer Bibliothek über ihre Nummer:
JSR Bibliotheksbasis+3*n
Bei einem 68k-Prozessor belegt ein Sprungbefehl 6 statt 3 Bytes, entsprechend muss im Aufruf dann mit 6 multipliziert werden.
Auf Hochsprachenebene erledigt die jeweilige Laufzeitbibliothek die Umrechnung eines Funktionsnamens oder einer -nummer in so einen Sprungbefehl.
Hier erkennt man auch den Vorteil der Methode: Wird bei einer Überarbeitung der Funktionsbibliothek beispielsweise die Implementierung der Funktion1 erweitert, so dass sie mehr Raum im ROM belegt, verschieben sich die Einsprungspunkte der höheren Funktionsnummern nach hinten. Die Sprungleiste ganz am Beginn ändert ihre Struktur aber nicht, so dass auch der Aufruf aus dem Anwendungsprogramm nicht geändert werden muss.
Beispiele
- Das Betriebssystem des Commodore-PET 2001 und seiner Nachfolger bis hin zum C64 hatte am Ende seines ROMs so eine Sprungtabelle für die wichtigsten Betriebssystemaufrufe. Beispielsweise stand in allen genannten Betriebssystemen auf Adresse
$FFD2
ein Sprung in die Routine zur Ausgabe eines einzelnen Zeichens (das im Akkumulator zu übergeben war) auf den Bildschirm. - Die Shared Libraries (Funktionsbibliotheken) des AmigaOS verfügen alle an ihrem Anfang über so eine Sprungtabelle, über die standardmäßig alle Aufrufe ihrer Funktionen erfolgen.