Vergleichen von vorzeichenlosen Werten
Vergleich | Beispiel | Flags | Mnemonic | Beschreibung |
---|---|---|---|---|
a==b | 12-12=0 | Z | breq | Branch if Equal (to Zero) |
a!=b | 12-13!=0 | !Z | brne | Branch if not Equal |
a<b | 12-13 | C | brlo | Branch if Lower |
a>=b | 12-12;13-12 | !C | brsh | Branch if same or higher |
Vergleiche von zwei Zahlen werden einfach durch eine Subtaktion sub,subi oder Scheinsubtraktion cp,cpi bei der nur die Flags gesetzt werden realisiert. Bei vorzeichenlosen Werten ist auf das N-Flag kein Verlass siehe Flags.
Nur C und Z funktionieren.
Einfache Verzweigung
Problem: 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. C=1 Je nach vorhandenem Spungbefehl wird nun entschieden, ob die Bedingung oder die invertierte Bedingung verwendet wird Beispiel:
Gegeben ist bereits folgender Quelltext:
.def a = R16 ;R16 als Variable a
ldi a,11 ;lade 11 in a
start:
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:
Welcher Sprungbefehl muss für das ? eingesetzt werden, Begründung?
Lösung
brsh, bei a=>13 soll ldi a,13 nicht ausgeführt werdenTesten Sie Ihre Lösung mit dem Simulator, verwenden Sie für den Test folgende Werte für a: 0,12,13,14,255.
Aufgaben
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; |
---|---|---|---|
Lösung
|
Lösung
|
Lösung
|
Lösung
|
if (a%4==1) b=1; else b=0; | a=0;while(a<10)b=a++; | for(b=0;b<=10;b++); | for(a=10;a>=0;a--)b=a; |
---|---|---|---|
Lösung
|
Lösung
|
Lösung
|
Lösung
|
Tabelle implementieren
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 |