Stapelspeicher und Unterprogramme 
Der Stapelspeicher ist ein Speicher nach dem
LIFO-Prinzip (Last In First Out) organisiert.
Daten die auf den „Stapel“ (Stack) gelegt werden, müssen -
vergleichbar einem Bücherstapel - in umgekehrter Reihenfolge
wieder vom Stack geholt werden müssen.
In einem Mikrocontroller ist der Stapelspeicher im internen RAM
untergebracht und kann daher auch durch normale Schreib/-Lese-Befehle
(mov) manipuliert werden. Dies sollte jedoch unbedingt vermieden
werden, da sich hierdurch fast immer Programmfehler ergeben. Der
Stackpointer (=Stapelzeiger) ist ein spezielles Register (81h),
welches immer auf das oberste Stapelelement (TOS = Top Of
Stack) zeigt. Der Boden des Stapels (BOS = Bottom
Of Stack) wird durch Schreiben der Startadresse des
Stack in den Stackpointer festgelegt. Beim 8051 ist das standardmäßig
die Adresse 07h. Manuelles Verändern des Stapelzeigers sollte
nur vor der ersten Stackbenutzung erfolgen!!
Beispiel für die Initialisierung des Stacks:
Speichern der Rücksprungadresse
für Unterprogramme
PowerPoint Präsentation zu Unterprogrammverarbeitung
Bei
Unterprogrammaufrufen (call-Befehl) wird die Rückkehradresse
(=2 Byte) zur Aufrufstelle auf dem Stack gespeichert und der Stackpointer
um 2 erhöht. Er zeigt nun auf das letzte gespeicherte (oder
besser gestapelte) Byte. Beim Rücksprung mit dem ret-Befehl
wird die Rückkehradresse wieder ausgelesen und der Stackpointer
entsprechend wieder um 2 erniedrigt! Unterprogrammaufrufe dürfen
auch verschachtelt werden, da der Rücksprung immer ins aufrufende
Unterprogramm erfolgt. Die Graphik unten zeigt wie Stackpointer
und der Stack bei 2 verschachtelten Unterprogrammen zusammenwirken.

Dieser
Vorgang läuft transparent ab, das heißt, der Programmierer
muss sich darum nicht kümmern. Probleme gibt es, wenn die Verschachtelungstiefe
zu hoch wird und der Stack in benutzte RAM Speicherstellen läuft.
Dies führt in der Regel zu Programmfehlern. Sinnvoll ist es,
den BOS auf die höchste im Programm verwendete RAM Adresse
zu setzen: 
Die Datenbereiche liegen im Beispiel immer unterhalb des Stackbereiches.
8051-Controller
die einen registeradressierbaren RAM-Bereich 80h bis FFh haben,
können auch diesen als Stack verwenden.

Daten manuell auf den Stack legen und wieder abholen
Registerinhalte
müssen häufig gezielt auf den Stack gerettet werden, da
sie in Unterprogrammen sonst verändert werden. Mit dem Befehl
push
adr
wird der Inhalt einer beliebigen RAM-Adresse auf den Stack gelegt.
Der Befehl pop
adr
stellt die entsprechende Speicherstelle wieder her. Unter Beachtung
des LIFO-Prinzips, dürfen push und pop auch verschachtelt werden.
Mit
push und pop können auch Daten in 2 Registern getauscht werden:
|