MezData-Logo Creative Commons License 487 Lösungen Button :AVR: Verzweigungen in Assembler

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. !(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.

Darstellung als Programm Ablauf Plan (PAP)

Stellen Sie das Progamm als PAP dar.

Übungen

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;

Lösungen..

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..