Am Anfang steht der Stapel

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 728
Registriert seit: Apr 2014
Bewertung: 5
#1
27.01.2016, 14:25

Hallo zusammen,

was in einer Hochsprache üblicherweise der Compiler oder Interpreter erledigt, muss in Assembler meistens der Programmierer berücksichtigen und auch umsetzen.

Ein wichtiger Bestandteil ist der sogenannte Stack oder Stapel. Dort werden zum Beispiel Variable abgelegt. Programmiert man in Assembler werden auf dem Stack Registerinhalte und Rücksprungadressen gesichert. Der Stapel baut sich von unten nach oben auf und wird von oben nach unten wieder abgebaut (Prinzip LIFO = Last in, first out, also was zuletzt auf den Stapel kommt, verlässt diesen als erstes).

Um den Stack im Assembler (natürlich bei einem AVR von Atmel) zu initialisieren, muss man folgendes tun:

 
ldi r16, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, r16
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, r16
 
 

Dabei ist RAMEND eine bereits vorbelegte Variable. Sie wird in der jeweiligen Definitionsdatei des Chips bereits definiert. Die Definitionsdateien werden, zumindest bei der Verwendung des AVR Studios, bereits mitgeliefert.

Die oben beschriebene Vorgehensweise gilt für Chip mit mehr als 256 Byte RAM. bei den kleineren Chip, den ATTinys, ist folgende Vorgehensweise korrekt:

 
ldi r16, RAMEND ; Stackpointer initialisieren
out SP, r16
 

Es ist empfehlenswert, den Stack gleich am Anfang des Programms zu initialisieren. Und zwar IMMER! Denn der erste "push"-Befehl im Programm benötigt bereits den Stack. Ist er nicht definiert, stürzt das Programm oft einfach ab und die Suche nach dem Fehler kann viel Zeit kosten.

Gruß
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste