8051-Mikrocontroller

 

Home

Grundlagen8051Programmierung

On-ChipSpeicherSFRsAssemblerBefehlsartenBefehlslisteUnterprogsInterrupts 

Banner Text Stapelspeicher und Unterprogramme PDF

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:
 

 

 

      arrow6_L.gif    

21.5.2009

    arrow6_R.gif