beginner_de
beginner_de
beginner_de
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.