|
|||||
|
|||||
Stapelspeicher und UnterprogrammeDer 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
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: 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 abholenRegisterinhalte
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:
|
|||||
|
|