Stapel

Aus C64-Wiki
Wechseln zu: Navigation, Suche

Der Stapel (engl. stack) ist ganz allgemein ein Zwischenspeicher, auf den nach dem "Last In - First Out"-Prinzip zugegriffen wird: Daten, die als letztes abgelegt werden, werden als erstes wieder entnommen.

Beim C64 und der dort eingesetzten CPU wird der Prozessorstapel auch vom BASIC-Interpreter mitgenutzt.

BASIC-Stapel[Bearbeiten]

Von BASIC aus wird der Prozessorstapel nur implizit bzw. intern durch den BASIC-Interpreter genutzt, allerdings in einem beschränkten und kontrolliertem Ausmaß, sodass auch bei maximaler Nutzung durch ein BASIC-Programm, noch ausreichend Platz für den Prozessorstapel-Bedarf der BASIC-Interpreter- und KERNAL-Routinen bleibt.
Spezielle Befehle zum direkten Zugriff auf den Stapel gibt es nicht - sie wären auch nicht sinnvoll, da der BASIC-Interpreter durch die "Zweitnutzung" des Prozessorstapels durch ein anderes Programm neben ihm nur durcheinander gebracht würde.

  • Unterprogrammbefehle GOSUB und RETURN legen Rücksprungreferenzen auf den Stapel bzw. holen sie wieder ab.
    Maximale Verschachtelungen: 26 (praktisch allerdings nur 24, wenn der innerste Aufruf zumindest alle BASIC-Befehle in einfacher Form ausführen können soll).
  • Die Befehle FOR und NEXT legen Verwaltungsinformationen auf dem Stapel ab.
    Maximale Verschachtelungen: 10 (praktisch allerdings nur 9, wenn die innerste Schleife zumindest alle BASIC-Befehle in einfacher Form ausführen können soll).
  • Klammerverschachtelungen von arithmetischen Ausdrücken verwenden im Zuge der rekursiven Auflösung den Stapel.
    Maximale Verschachtelungen: 10
  • Die Befehle CLR, NEW, RUN leeren den BASIC-Stapel bzw. setzen ihn zurück.

Werden Schleifen, Unterprogramme oder arithmetische Ausdrücke zu tief ineinander verschachtelt, so erfolgt bei einem Überlauf des Stapels die Meldung des Fehlers ?OUT OF MEMORY ERROR. Andere, spezifische Fehlermeldungen sind den oben erwähnten BASIC-Befehlen zu entnehmen, welche dann eintreten, wenn die Verschachtelung beispielsweise falsch oder unvollständig geformt ist.

BASIC verwendet noch einen weiteren Stapel, der die Zeichenkettenverarbeitung unterstützt und welcher als Temporary String Descriptor Stack (kurz Descriptor Stack) bzw. Zeichenkettenstapel bekannt ist. Dieser ist vom Prozessorstapel unabhängig.

Prozessorstapel[Bearbeiten]

Der Prozessorstapel (engl. processor stack) ist ein besonderer Speicherbereich im RAM eines Computers, in dem die CPU Daten mit typischerweise geringem Speicherverbrauch und schnellem Zugriff (insbesondere Rücksprungadressen, Zwischenspeicherung von CPU-Register und Zwischenergebnisse von Unterroutinen) ablegen kann.

Bei der MOS 6510-CPU des C64 liegt der Prozessorstapel[1] in einem 256 Byte großer Speicherbereich, der sogenannten Page 1, von hexadezimal $0100 bis $01FF (Speicherbelegungsplan). Der Stapelzeiger (kurz SP) verweist auf die nächste freie Stapelspeicherstelle. Der Stapel wird von oben nach unten gefüllt, d.h. das erste auf den Stapel gelegte Byte wandert nach $01FF; der Stapelzeiger zeigt danach auf $01FE.

Bei CPUs der 6502-Famlie auf Maschinenebene bzw. bei der Assembler-Programmierung gibt es mit folgenden Befehlen oder Subsystemen Berührungspunkte zum Stapel:

  • PHA, PHP, JSR $hhll, BRK legen Daten am Stapel ab.
  • PLA, PLP, RTS, RTI holen Daten vom Stapel.
  • TSX und TXS dienen zur Manipulation des Stapelzeigers.
  • Durch Interrupts werden Daten (Rücksprungadresse, ggf. Statusregister) am Stapel abgelegt.
  • Das Statusregister (als 8-Bit-Wert) kann nur über den "Umweg" des Prozessorstapels gelesen bzw. geschrieben werden.
  • Mit der Adressierungsart Absolut X-indiziert kann nach vorhergehendem Laden des X-Registers mit dem Stapelzeigerwert wahlfrei auf Elemente des Stacks zugegriffen werden:
TSX
LDA $0101,X  ; das 1. Byte am Stack
LDA $0102,X  ; das 2. Byte am Stack

Bei der Initialisierung durch das KERNAL nach einem CPU-Reset wird der Stapelzeiger auf die Adresse $01FF (d.h. das Register SP enthält $FF) gesetzt.

Weblinks[Bearbeiten]

WP-W11.png Wikipedia: Last In – First Out
WP-W11.png Wikipedia: Stapelspeicher


Referenzen[Bearbeiten]

  1. 6502 STACKS: More than you thought Sprache:englisch