Hallo zusammen,
im Allgemeinen ist es im AVR Assembler ja üblich, ein Label zu
definieren und per rjmp, breq, ... dorthin zu springen. Allerdings gibt
es ja auch die Möglichkeit über den Programmcounter (PC) um einfach
einige Anweisungen nach "vorne"/"hinten" zu springen.
Beispiel:
1 | lds temp2, RAMSTART + A_MENULEVEL
|
2 | tst temp2
|
3 | brne PC + 6
|
4 | lds temp1, RAMSTART + A_MENUENTRY0
|
5 | lds temp2, RAMSTART + A_MENUMAXE0
|
6 | rjmp PC + 4
|
7 | lds temp1, RAMSTART + A_MENUENTRY1
|
8 | lds temp2, RAMSTART + A_MENUMAXE1
|
Das funktioniert so, aber mir ist nicht ganz klar, wie man den
korrekten Betrag für den Programmcounter ausrechnet. Um eine einzelne
Zeile zu überspringen scheint ja 2 der richtige Betrag zu sein. Beim
oben genannten brne ist es 6 für drei Zeilen, daher eigentlich immer zu
überspringende Zeilenzahl * 2. Aber stimmt das wirklich so?
An einem anderen Ort im Programm hab' ich z.B. diese Konstruktion:
1 | sbic PIND, 3
|
2 | rjmp PC + 4
|
3 | sbrs Buttons, BTN_ENTER
|
4 | sbr Buttons, 1 << BTN_ENTER_F
|
5 | rjmp PC + 2
|
6 | cbr Buttons, 1 << BTN_ENTER
|
Auch das funzt, obwohl hier beim ersten rjmp mit dem Betrag 4 gleich
drei Anweisungen übersprungen werden :-/
Spielt die Art der Anweisungen eine Rolle?
Ich wäre froh, wenn mir das mal jemand erklären könnte, im Datenblatt
finde ich grade nix dazu...
Danke im Voraus!