:AVR: Verzweigungen in AssemblerProblem: Der Ausdruck if (a<=13) a=13 für a von 0..255 mit 8Bit soll in Assembler realisiert werden.
In Assembler werden zwei Zahlen verglichen indem man sie von einander abzieht (Compare-Befehl: cp bzw. cpi) und die dabei gesetzten ALU-Flags betrachtet:
a<=13 gdw. a-13<=0. gdw. !(a-13>0) Je nach vorhandenem Spungbefehl wird nun entschieden ob die Bedingung oder die invertierte Bedingung verwendet wird Beispiel:
Gegeben ist bereits folgender Quelltext:
.include "tn2313def.inc" .def a = R16 ;R16 als Variable a ldi a,11 ;lade 11 in a cpi a,13 ;vergleiche mit Konstante dabei wird subi ausgführt nur mit Speichern der Flags ohne a zu verändern ? weiter ;Sprung zur Marke weiter ldi a,13 ;a=13 weiter: nop
Welcher Sprungbefehl muss für das ? eingesetzt werden, Begründung? brsh
Testen Sie Ihre Lösung mit dem Simulator, verwenden Sie für den Test folgende Werte für a: 0,12,13,14,255.
Stellen Sie das Progamm als PAP dar.
Erstellen Sie Assemblerprogramme, testen und dokumentieren Sie sie mit PAP für folgende Probleme:
b=3; if (a==2) b=7;
if (a==2) b=7; else b=3;
if (a==1 && b==1) c=1; else c=0;
if (a&3==1 && a / 4==1) b=1; else b=0;
if (a%4==0 && a>20) a=99;
for (i=0; i<10; i++) a=i;
Eine Wertetabelle soll interpetiert werden, die Eingaben a sind positive 8Bit Zahlen (unsigned char). Zeigen Sie die Korrektheit Ihrer Lösung durch sinnvolle Testwerte:
| Eingabe a (R16) | Ausgabe b (R17) | Testen mit |
|---|---|---|
| <4 | 0 | 0,3 |
| 4..8 | 1 | 4,8 |
| >8 | 2 | 9,255 |