MezData-Logo

Verzweigungen in Assembler

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

PAPProblem: 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 werden

Testen 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
start:  
  ldi b,3
  cpi a,2
  brne weiter
  ldi b,7
weiter:
Lösung

start:
  ldi b,3
  cpi a,2
  brne weiter
  ldi b,7
weiter:
Lösung

start:
  ldi c,0
  cpi a,1
  brne weiter
  cpi b,1
  brne weiter
  ldi c,1
weiter:
PAP
Lösung

start:
  cpi a, 5
  breq lol
  ldi b,0
  rjmp weiter
lol:
  ldi b,1
weiter:
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

start:
  mov b,a
  andi b,3
  cpi b,1
  breq ende
  ldi b,0
ende:
Lösung

start:
  ldi a, 0
schleife:
  cpi a, 10
  brsh ende
  mov b,a
  inc a
  rjmp schleife
ende:
PAP
Lösung
start:
  ldi b,0
for:
  cpi b,11
  brsh ende
  inc b
  rjmp for
ende:
Lösung
start:
  ldi a,10
for:
  cpi a,0
  brlo ende
  mov b,a
  dec a
  rjmp for
ende:

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
Lösung anzeigen..