12. Εντολές διακλάδωσης υπό συνθήκη

Εντολές  σύγκρισης

Οι μικροελεγκτές AVR έχουν την εντολή CP για να συγκρίνουν τελεστέους. Η εντολή σύγκρισης στην ουσία είναι μια αφαίρεση, όπου οι τιμές των τελεστέων δεν αλλάζουν. Υπάρχει επίσης και η εντολή “CPI  Rd, k” στην οποία ο δεξιός τελεστέος είναι μια σταθερή τιμή. Ο AVR έχει μερικές εντολές διακλάδωσης που μπορούν να χρησιμοποιηθούν μετά την εντολή CP για να πάρει αποφάσεις βασισμένες στο αποτέλεσμα της εντολής CP.

Οι εντολές διακλάδωσης υπό συνθήκη, προκαλούν διακλάδωση της ροής εκτέλεσης του κώδικα όταν συμβεί η κατάλληλη συνθήκη. Στους AVR υπάρχουν το λιγότερο δυο υπό συνθήκη διακλαδώσεις για κάθε σημαία του καταχωρητή κατάστασης. Παρακάτω θα μελετήσουμε τις πιο σημαντικές εντολές διακλάδωσης υπό συνθήκη.

Οι εντολές  BREQ και BRNE

 BREQ  k     ; if (Z=1)  then  branch
             ; else  continue

H CPU με την εντολή BREQ παίρνει απόφαση βασισμένη στη σημαία Ζ. Εάν  Ζ=1 η εντολή BREQ εκτρέπει τη ροή της εκτέλεσης του κώδικα. Σημείωση: Μετά την εκτέλεση της CP εάν Ζ=1 αυτό σημαίνει ότι οι τελεσταίοι είναι ίσοι. Μετά την εκτέλεση της εντολής DEC η σημαία Ζ παίρνει την τιμή 1 (Ζ=1) όταν ο τελεστέος της εντολής DEC πάρει την τιμή μηδέν.

Η CPU με την εντολή BRNE (όπως και με την BREQ) παίρνει απόφαση βασισμένη στη σημαία Ζ. Εάν Ζ=0 η BRNE προκαλεί εκτροπή της ροής εκτέλεσης του κώδικα. Μετά την εντολή CP, όταν Ζ=0 αυτό σημαίνει ότι οι τελεστέοι δεν είναι ίσοι. Μετά την εκτέλεση της εντολής DEC εάν Ζ=0 αυτό σημαίνει ότι ο τελεστέος δεν είναι ίσος με μηδέν.

Σημείωση: Οι εντολές BREQ και BRNE μπορούν να χρησιμοποιηθούν για προσημασμένους και για μη προσημασμένους αριθμούς.

Παράδειγμα

Γράψε ένα πρόγραμμα που να ελέγχει την PORTB συνεχώς για την τιμή 0x63. Θα πρέπει να σταματήσει να ελέγχει εάν PORTB = 0x63.

        LDI R20, 0x00
        OUT DDRB, R20        ; PORT B is input
        LDI R21, 0x63
AGAIN:
        IN  R20, PINB
        CP R20, R21          ; compare with 0x63,  Z=1  if  yes
        BRNE   AGAIN         ; go to AGAIN if PORTB is not equal to 0x63 
        . . . . . .

Οι εντολές BRSH και BRLO

  BRSH  k     ; if (C=0)  then branch
              ; else  continue

Με την BRSH η CPU αποφασίζει βασισμένη στη σημαία C. If  C=0 (που σημαίνει ότι μετά την εντολή CP με τελεστέους μη προσημασμένους αριθμούς ο αριστερός τελεστέος της εντολής CP είναι ίσος ή μεγαλύτερος από τον δεξιό τελεστέο) τότε η CPU θα κάνει διακλάδωση.

Η εντολή BRLO όπως η BRSH η CPU αποφασίζει βασισμένη στη σημαία C και διακλαδώνει όταν C=1 (Μετά την εντολή CP για μη προσημασμένους αριθμούς C=1 σημαίνει ότι ο αριστερός τελεστέος της εντολής CP είναι μικρότερος από τον δεξιό τελεστέο)

Σημείωση: Οι εντολές BRSH και BRLO μπορούν να χρησιμοποιηθούν για την σύγκριση μη προσημασμένων αριθμών. Για τη σύγκριση προσημασμένων αριθμών θα πρέπει να χρησιμοποιήσεις τις εντολές BRGE και BRLT.

Παράδειγμα

Γράψε ένα πρόγραμμα που να βρει τον μεγαλύτερο αριθμό από τους 21 και 63 και να τον τοποθετήσει στον R20.

.EQU  VAL_1=21
.EQU  VAL_2=63
            LDI  R20, VAL_1     ; R20 = VAL_1
            LDI  R21, VAL_2     ; R21 = VAL_2
            CP  R21, R20        ; compare R21 and R20
            BRLO  NEXT          ; if  R21<R20  (branch if lower) go to NEXT
            LDI  R20,  VAL_2    ; R20 = VAL_2
NEXT:

Οι εντολές BRGE και BRLT

Με την εντολή BRGE η CPU αποφασίζει βασισμένη στη σημαία S. Εάν S=0 (στην οποία μετά την εντολή CP για προσημασμένους αριθμούς, σημαίνει ότι ο αριστερός τελεστέος της CP εντολής είναι μεγαλύτερος ή ίσος από τον δεξιό τελεστέο) και τότε με την εντολή BRGE προκαλείται διακλάδωση μπροστά ή πίσω σχετικά με τον program counter.

Η εντολή BRLT (όπως την BRGE) προκαλεί διακλάδωση, αλλά εδώ όταν S=1, δηλαδή ο αριστερός τελεστέος της εντολής CP είναι μικρότερος από τον δεξιό τελεστέο). Σημειώστε ότι οι εντολές BRGE και BRLT χρησιμοποιούνται για προσημασμένους αριθμούς.

Οι εντολές BRVS και BRVC

Όπως έχουμε αναφέρει σε προηγούμενη ενότητα, θα πρέπει ο προγραμματιστής να διαβάζει την σημαία υπερχείλισης V για να ειδοποιείται στην περίπτωση υπερχείλισης, ώστε να κάνει κατάλληλο χειρισμό του σφάλματος. Οι εντολές BRVC και BRVS σου επιτρέπουν να ελέγχεις τη σημαία V και να διακλαδώνεις τη ροή του προγράμματος όταν συμβαίνει υπερχείλιση.

Παράδειγμα

Γράψε ένα πρόγραμμα που να προσθέτει δυο προσημασμένους αριθμούς. Οι αριθμοί είναι φορτωμένοι στους καταχωρητές R21 και R22. Το πρόγραμμα θα πρέπει να αποθηκεύσει το αποτέλεσμα στον R21. Εάν το αποτέλεσμα δεν είναι σωστό το πρόγραμμα θα πρέπει να στείλει την τιμή 0xAA στην PORTB και να μηδενήσει τον R21.

LDI  R21,  0xFA         ; R21 = 0xFA
LDI  R22,  0x05         ; R22 = 0x05
LDI  R23,  0xFF         ; R23 = 0xFF
OUT  DDRB, R23          ; Port B is output
ADD  R21,  R22          ; R21 = R21 + R22
BRVC NEXT               ; if V = 0 (no error) then go to next
LDI  R23,  0xAA         ; R23 = 0xAA
OUT  PORTB, R23         ; send 0xAA to PORTB
LDI  R21, 0x00          ; clear R21
NEXT:   . . . .

Οι εντολές BRPL και BRMI

Οι εντολές BRPL και BRMI επιτρέπουν τον έλεγχο της σημαίας (το bit προσήμου D7) και να επιτρέπουν την διακλάδωση τη ροής του προγράμματος ανάλογα με τη σημαία Ν. Με την εντολή BRPL η CPU διακλαδώνει τη ροή εκτέλεσης όταν Ν=0 ενώ η εντολή BRMI διακλαδώνει όταν Ν=1.