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. 49<br />
und ORG trivial sind, können sie auch weggelassen wer<strong>de</strong>n und <strong>de</strong>r Assembler macht das dann automatisch<br />
so. Wer aber <strong>de</strong>n Beginn <strong>de</strong>s Co<strong>de</strong>s nach zwei Seiten Konstanten<strong>de</strong>finitionen ein<strong>de</strong>utig<br />
markieren will, kann das mit <strong>de</strong>n bei<strong>de</strong>n Direktiven tun.<br />
Auf das ominöse erste Wort Programmco<strong>de</strong> folgen fast ebenso wichtige Spezialinstruktionen, die<br />
Interrupt-Vektoren. Dies sind festgelegte Stellen mit bestimmten Adressen. Diese Adressen wer<strong>de</strong>n<br />
bei Auslösung eines Interrupts durch die Hardware angesprungen, wobei <strong>de</strong>r normale Programmablauf<br />
unterbrochen wird. Diese Vektoren sind spezifisch für je<strong>de</strong>n Prozessortyp (siehe unten bei <strong>de</strong>r<br />
Erläuterung <strong>de</strong>r Interrupts). Die Instruktionen, mit <strong>de</strong>nen auf eine Unterbrechung reagiert wer<strong>de</strong>n<br />
soll, müssen an dieser Stelle stehen. Wer<strong>de</strong>n also Interrupts verwen<strong>de</strong>t, dann kann die erste Instruktion<br />
nur eine Sprunginstruktion sein, damit diese ominösen Vektoren übersprungen wer<strong>de</strong>n. Der typische<br />
Programmablauf nach <strong>de</strong>m Reset sieht also so aus:<br />
.CSEG<br />
.ORG 0000<br />
RJMP Start<br />
[...] hier kommen dann die Interrupt-Vektoren<br />
[...] und danach nach Belieben noch alles mögliche an<strong>de</strong>re Zeug<br />
Start: ; Das hier ist <strong>de</strong>r Programmbeginn<br />
[...] Hier geht das Hauptprogramm dann erst richtig los.<br />
Die Instruktion RJMP bewirkt einen Sprung an die Stelle im Programm mit <strong>de</strong>r Kennzeichnung<br />
Start:, auch ein Label genannt. Die Stelle Start: folgt weiter unten im Programm und ist <strong>de</strong>m Assembler<br />
hiermit entsprechend mitgeteilt: Labels beginnen immer in Spalte 1 einer Zeile und en<strong>de</strong>n<br />
mit einem Doppelpunkt. Labels, die diese bei<strong>de</strong>n Bedingungen nicht einhalten, wer<strong>de</strong>n vom Assembler<br />
nicht ernstgenommen. Fehlen<strong>de</strong> Labels aber lassen <strong>de</strong>n Assembler sinnierend innehalten und<br />
mit einer "Un<strong>de</strong>fined label"-Fehlermeldung die weitere Zusammenarbeit einstellen.<br />
9.2 Linearer Programmablauf und Verzweigungen<br />
Nach<strong>de</strong>m die ersten Schritte im Programm gemacht sind, noch etwas triviales: Programme laufen<br />
linear ab. Das heißt: Instruktion für Instruktion wird nacheinan<strong>de</strong>r aus <strong>de</strong>m Programmspeicher geholt<br />
und abgearbeitet. Dabei zählt <strong>de</strong>r Programmzähler immer eins hoch. Ausnahmen von dieser<br />
Regel wer<strong>de</strong>n nur vom Programmierer durch gewollte Verzweigungen o<strong>de</strong>r mittels Interrupt herbeigeführt.<br />
Da sind Prozessoren ganz stur immer gera<strong>de</strong>aus, es sei <strong>de</strong>nn, sie wer<strong>de</strong>n gezwungen.<br />
Und zwingen geht am einfachsten folgen<strong>de</strong>rmaßen. Oft kommt es vor, dass in Abhängigkeit von bestimmten<br />
Bedingungen gesprungen wer<strong>de</strong>n soll. Dann benötigen wir bedingte Verzweigungen. Nehmen<br />
wir an, wir wollen einen 32-Bit-Zähler mit <strong>de</strong>n Registern R1,<br />
R2, R3 und R4 realisieren. Dann muss das nie<strong>de</strong>rwertigste Byte in<br />
R1 um Eins erhöht wer<strong>de</strong>n. Wenn es dabei überläuft, muss auch<br />
R2 um Eins erhöht wer<strong>de</strong>n usw. bis R4.<br />
Die Erhöhung um Eins wird mit <strong>de</strong>r Instruktion INC erledigt.<br />
Wenn dabei ein Überlauf auftritt, also 255 zu 0 wird, dann ist das<br />
im Anschluss an die Durchführung am gesetzten Z-Bit im Statusregister<br />
zu bemerken. Das eigentliche Übertragsbit C <strong>de</strong>s Statusregisters<br />
wird bei <strong>de</strong>r INC-Instruktion übrigens nicht verän<strong>de</strong>rt,<br />
weil es woan<strong>de</strong>rs dringen<strong>de</strong>r gebraucht wird und das Z-Bit völlig<br />
ausreicht. Wenn <strong>de</strong>r Übertrag nicht auftritt, also das Z-Bit nicht<br />
gesetzt ist, können wir die Erhöherei been<strong>de</strong>n. Wenn aber das Z-