02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Avr-Asm-Tutorial S. 47<br />

RET<br />

Beim RCALL wird <strong>de</strong>r Programmzähler, eine 16-Bit-Adresse, auf <strong>de</strong>m Stapel abgelegt. Das sind<br />

zwei mal PUSH, dann sind die 16 Bits auf <strong>de</strong>m Stapel. Beim Erreichen <strong>de</strong>r Instruktion RET wird<br />

<strong>de</strong>r Programmzähler mit zwei POPs wie<strong>de</strong>r hergestellt und die Ausführung <strong>de</strong>s Programmes geht an<br />

<strong>de</strong>r Stelle weiter, die auf <strong>de</strong>n RCALL folgt.<br />

Damit braucht man sich weiter um die Adresse keine Sorgen zu machen, an <strong>de</strong>r <strong>de</strong>r Programmzähler<br />

abgelegt wur<strong>de</strong>, weil <strong>de</strong>r Stapel automatisch manipuliert wird. Selbst das vielfache Verschachteln<br />

solcher Aufrufe ist möglich, weil je<strong>de</strong>s Unterprogramm, das von einem Unterprogramm aufgerufen<br />

wur<strong>de</strong>, zuoberst auf <strong>de</strong>m Stapel die richtige Rücksprungadresse fin<strong>de</strong>t.<br />

Unverzichtbar ist <strong>de</strong>r Stapel bei <strong>de</strong>r Verwendung von Interrupts. Das sind Unterbrechungen <strong>de</strong>s Programmes<br />

aufgrund von äußeren Ereignissen, z.B. Signale von <strong>de</strong>r Hardware. Damit nach Bearbeitung<br />

dieser äußeren "Störung" <strong>de</strong>r Programmablauf wie<strong>de</strong>r an <strong>de</strong>r Stelle vor <strong>de</strong>r Unterbrechung<br />

fortgesetzt wer<strong>de</strong>n kann, muss die Rücksprungadresse bei <strong>de</strong>r Unterbrechung auf <strong>de</strong>n Stapel. Interrupts<br />

ohne Stapel sind also schlicht nicht möglich.<br />

Fehlermöglichkeiten beim (Hoch-)Stapeln<br />

Für <strong>de</strong>n Anfang gibt es reichlich Möglichkeiten, mit <strong>de</strong>m Stapeln üble Bugs zu produzieren.<br />

Sehr beliebt ist die Verwendung <strong>de</strong>s Stapels ohne vorheriges Setzen <strong>de</strong>s Stapelzeigers. Da <strong>de</strong>r Zeiger<br />

zu Beginn bei Null steht, klappt aber auch rein gar nix, wenn man <strong>de</strong>n ersten Schritt vergisst.<br />

Beliebt ist auch, irgendwelche Werte auf <strong>de</strong>m Stapel liegen zu lassen, weil die Anzahl <strong>de</strong>r POPs<br />

nicht exakt <strong>de</strong>r Anzahl <strong>de</strong>r PUSHs entspricht. Das ist aber schon seltener. Es kommt vorzugsweise<br />

dann vor, wenn zwischendurch ein bedingter Sprung nach woan<strong>de</strong>rs vollführt wur<strong>de</strong> und dort beim<br />

Programmieren vergessen wird, dass <strong>de</strong>r Stapel noch was in Petto hat.<br />

Noch seltener ist ein Überlaufen <strong>de</strong>s Stapels, wenn zuviele Werte abgelegt wer<strong>de</strong>n und <strong>de</strong>r Stapelzeiger<br />

sich bedrohlich auf an<strong>de</strong>re, am Anfang <strong>de</strong>s SRAM abgelegten Werte zubewegt o<strong>de</strong>r noch<br />

niedriger wird und in <strong>de</strong>n Bereich <strong>de</strong>r Ports und <strong>de</strong>r Register gerät. Das hat ein lustiges Verhalten<br />

<strong>de</strong>s Chips, auch äußerlich, zur Folge. Kommt aber meistens fast nie vor, nur bei vollgestopftem<br />

SRAM.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!