Stackpointer - Gestapelte Daten
Materialbedarf
Anz. | Bezeichnung | Datenblatt |
1 | Spannungsversorgung | |
1 | CMOS-IC 4029 | |
2 | 4-Bit Dateneingabe | |
1 | 4-Bit Datenausgabe |
Funktion des Stapels
Neben dem Programmzeiger gibt es noch einen zweiten Zeiger der für eine CPU äußerst wichtig ist. Es ist der Stapelzeiger oder auch Stackpointer. Dieser verwaltet den so genannten Programmstack. Was aber ist ein Programmstack und wozu dient dieser?
Neben etlichen Lade, arithmetischen, logischen und einfachen Sprungbefehlen, gibt es auch einige Befehle, die es ermöglichen, Unterprogramme aufzurufen. Für diejenigen, die mit dem Begriff Unterprogramm nichts anfangen können, hier einmal ein kleines Beispiel:
Temperatur von Sensor 1 lesen Unterroutine 'Temperatur prüfen' aufrufen Temperatur von Sensor 2 lesen Unterroutine 'Temperatur prüfen' aufrufen Prüfungen wiederholen
Temperatur prüfen: Ist Temperatur>20° und <30°? Wenn nicht, Alarm Zurück |
Hier wird also mehrmals die Routine 'Temperatur prüfen' aufgerufen. Ist die Prüfung erfolgt, kehrt das Programm an die Stelle zurück, wo die Routine aufgerufen wurde.
In unserer CPU gibt es dafür 2 Befehle die Ähnliches bewirken. Es sind die Befehle CALL und RET. Mit CALL wird eine Unterroutine aufgerufen während RET für die Rückkehr sorgt. Wird mit CALL eine Unterroutine aufgerufen, so muss sich die CPU ja merken, von wo die Routine aufgerufen wurde. Und hier kommt nun der Stackpointer ins Spiel.
Der Stack ist ein kleiner Bereich im Speicher, welcher sich die Rücksprungadressen der CALL-Befehle merkt. Bei jedem CALL wächst der Stapelspeicher ein wenig. Man kann sich den Stack wie ein Zettelstapel vorstellen. Bei jedem Unterprogrammaufruf wird ein Zettel mit der Rücksprungadresse auf den Stapel gelegt. Wird die Unterroutine verlassen, durch ein RET, so wird der oberste Zettel genommen, und die CPU schaut nach, ab welcher Programmposition sie nun weitermachen soll.
Nun wächst der Stack, in der Regel, nicht von unten nach oben, sondern von oben nach unten. Häufig beginnt der Stack auch am Ende des verfügbaren Arbeitsspeichers. So ist die Wahrscheinlichkeit am geringsten, dass sich Programm und Stack ins Gehege kommen.
Der Aufbau
Die Schaltung des Stackpointers unterscheidet sich nur sehr gering von der des Programmzählers. Da der Stackpointer, im Gegensatz zum Programmzähler, auf- und abwärts zählen kann, müssen wir den Eingang des 4029 auch auf einen Eingabetaster legen. Bevor der Stack verwendet werden kann, muss erst festgelegt werden, wo der Stackbeginn liegen soll. Hierzu wird mit dem Eingabeboard A die gewünschte Startadresse eingestellt und dann mit B1 übernommen. Nun kann der Stack eingesetzt werden. Soll ein CALL-Befehl ausgeführt werden, so wird die aktuelle Programmadresse an die Speicheradresse angelegt, die das Ausgebaport anzeigt. Dann wird mit B0 der Stackzeiger verringert. Hierzu darf B2 nicht aktiv sein. Wurde die Unterroutine beendet, muss der Stackzeiger wieder erhöht werden. Hierzu muss jetzt B2 aktiviert werden und durch B0 der Stackzeiger wieder erhöht werden. Nun wird der Programmzähler mit den Inhalt der Speicherzelle geladen, auf den der Stackzeiger zeigt. |
Wie bereits beim Programmzähler, besteht auch der Stackpointer aus 8 Bit. Dazu muss der 4029 kaskadiert werden. Die genaue vorgehensweise bitte noch einmal beim Programmzähler nachlesen. |