beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 46<br />
zessor. So steht z.B. in <strong>de</strong>r Datei 8515<strong>de</strong>f.inc die Zeile<br />
.equ RAMEND =$25F ;Last On-Chip SRAM Location<br />
Die Datei 8515<strong>de</strong>f.inc kommt wie<strong>de</strong>r mit <strong>de</strong>r Assembler-Direktive<br />
.INCLUDE "8515<strong>de</strong>f.inc"<br />
irgendwo am Anfang <strong>de</strong>s Assemblerprogrammes hinzu.<br />
Damit ist <strong>de</strong>r Stapelzeiger eingerichtet und wir brauchen uns im weiteren nicht mehr weiter um diesen<br />
Zeiger kümmern, weil er ziemlich automatisch manipuliert wird.<br />
Verwendung <strong>de</strong>s Stapels<br />
Die Verwendung <strong>de</strong>s Stapels ist unproblematisch. So lassen sich Werte von Registern auf <strong>de</strong>n Stapel<br />
legen:<br />
PUSH MeinLieblingsregister ; Ablegen <strong>de</strong>s Wertes<br />
Wo <strong>de</strong>r Registerinhalt abgelegt wird, interessiert uns nicht weiter. Dass dabei <strong>de</strong>r Zeiger automatisch<br />
erniedrigt wird, interessiert uns auch nicht weiter. Wenn wir <strong>de</strong>n abgelegten Wert wie<strong>de</strong>r brauchen,<br />
geht das einfach mit:<br />
POP MeinLieblingsregister ; Rücklesen <strong>de</strong>s Wertes<br />
Mit POP kriegen wir natürlich immer nur <strong>de</strong>n Wert, <strong>de</strong>r als letztes mit PUSH auf <strong>de</strong>n Stapel abgelegt<br />
wur<strong>de</strong>. Wichtig: Selbst wenn <strong>de</strong>r Wert vielleicht gar nicht mehr benötigt wird, muss er mit Pop<br />
wie<strong>de</strong>r vom Stapel! Das Ablegen <strong>de</strong>s Registers auf <strong>de</strong>n Stapel lohnt also programm-technisch immer<br />
nur dann, wenn<br />
• <strong>de</strong>r Wert in Kürze, d.h. ein paar Instruktionen weiter im Ablauf, wie<strong>de</strong>r gebraucht wird,<br />
• alle Register in Benutzung sind und,<br />
• keine Möglichkeit zur Zwischenspeicherung woan<strong>de</strong>rs besteht.<br />
Wenn diese Bedingungen nicht vorliegen, dann ist die Verwendung <strong>de</strong>s Stapels ziemlich nutzlos<br />
und verschwen<strong>de</strong>t bloß Zeit.<br />
Stapel zum Ablegen von Rücksprungadressen<br />
Noch wertvoller ist <strong>de</strong>r Stapel bei Sprüngen in Unterprogramme, nach <strong>de</strong>ren Abarbeitung wie<strong>de</strong>r<br />
exakt an die aufrufen<strong>de</strong> Stelle im Programm zurück gesprungen wer<strong>de</strong>n soll. Dann wird beim Aufruf<br />
<strong>de</strong>s Unterprogrammes die Rücksprungadresse auf <strong>de</strong>n Stapel abgelegt, nach Beendigung wie<strong>de</strong>r<br />
vom Stapel geholt und in <strong>de</strong>n Programmzähler bugsiert. Dazu dient die Konstruktion mit <strong>de</strong>r Instruktion<br />
RCALL irgendwas ; Springe in das UP irgendwas<br />
[...] hier geht es normal weiter im Programm<br />
Hier lan<strong>de</strong>t <strong>de</strong>r Sprung zum Label irgendwas irgendwo im Programm,<br />
irgendwas: ; das hier ist das Sprungziel<br />
[...] Hier wird zwischendurch irgendwas getan<br />
[...] und jetzt kommt <strong>de</strong>r Rücksprung an <strong>de</strong>n Aufrufort im Programm: