02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!