Stapelmaschine
← Fehlercode | ● | Stapelbeispiel →
Das Kernkonzept eines Rechners ist die Registermaschine. Dieses Konzept ermöglicht es beliebige Rechnungen effizient mit Hilfe der Rechenregister durchzuführen.
Schema:
- Laden von Werten aus Speicher (Variable) in Register (Mnemonic MOV)
- Durchführung von Berechnung[en] im Register (Mnemonics ADD, SUB, MUL, DIV etc.)
- Abspeichern von Registerwert in Speicher (Mnemonic MOV)
Zusätzlich werden Funktionen benötigt, um die Berechnungen zu logischen Einheiten gruppieren zu können. Das Konzept der Stapelmaschine (Stackmachine) dient nun dem Zweck, die Funktionsaufrufe effizient auf der Maschinencode-Ebene durchführen zu können.
Auf Maschinecode-Ebene bedeutet ein Funktionsaufruf, dass die aktuelle sequentielle Programmausführung unterbrochen wird und an die Adresse der jeweiligen kompilierten Funktion gesprungen wird. Man spricht hier von einem Sprung zu einer Unterroutine (Jump to Subroutine, Maschinencode Mnemonic JSR).
Gleichzeitig muss die Rücksprungadresse gespeichert werden, an der das Programm fortgesetzt werden soll, wenn die Funktion beendet ist (Return from Subroutine, Mnemonics RSR, RET). Dazu wird die Rücksprungadresse an oberster Stelle auf dem sogenannten System-Stapel (system stack) abgelegt. Beim Verlassen einer Unterroutine wird der oberste Eintrag des Stapels entfernt und an die entsprechende Adresse zurückgesprungen.
- Funktionsaufruf: Push auf den Stapel (aktuelle Anweisungsadresse)
- Funktionsende: Pop auf den Stapel (vorhergehende Anweisungsadresse)
Auf die Art und Weise kann der Programmablauf nicht nur durch einen einzigen sondern durch mehrere verschachtelte Funktionsaufrufe hindurch verfolgt werden. Die Höhe des Stapels entspricht der Verschachtelungstiefe der Funktionsaufrufe.
Die Aufrufparameter werden auch auf dem Stapel abgelegt, so dass für jeden Aufruf eine lokale Kopie (bzw. Instanz) einer Parametervariable vorhanden ist. Beim Verlassen der Funktion werden die aktuellen lokalen Parameter vom Stapel entfernt.
Zusätzliche lokale Variablen werden ebenfalls auf dem Stapel angelegt und bei Funktionsende wieder entfernt.
Ebenso wird der Funktionswert auf dem Stapel abgelegt, so dass ihn die aufrufende Funktion verwenden kann, indem die Funktion den obersten Stapeleintrag abholt.
← Fehlercode | ● | Stapelbeispiel →