Εντολές δημιουργίας λογικών εκφράσεων

Εκτός από τις Ι/Ο και τις αριθμητικές εντολές, οι λογικές εντολές είναι μερικές από τις πιο ευρέα χρησιμοποιούμενες εντολές. Σε αυτή την ενότητα καλύπτουμε τις Boolean λογικές εντολές όπως οι AND, OR, Exclusive – OR (XOR) και το συμπλήρωμα.

Η λογική εντολή AND

AND  Rd, Rr   ;    Rd = Rd AND Rr

Αυτή η εντολή εκτελεί το λογικό AND πάνω σε δυο τελεστέους (GPRs) και τοποθετεί το αποτέλεσμα στο αριστερό τελεστέο. Επίσης υπάρχει και η εντολή “AND  Rd, k” όπου ο δεξιός τελεστέος είναι μια σταθερή τιμή. Η εντολή AND επηρεάζει τις σημαίες Z, S και Ν. Η σημαία Ν είναι το bit D7 του αποτελέσματος και Ζ=1 εάν το αποτέλεσμα είναι ίσο με μηδέν.

Η εντολή AND χρησιμοποιείται συχνά για μάσκα δηλαδή θέτει σε 0 ορισμένα bit του πρώτου τελεστέου. Μελέτησε το ακόλουθο παράδειγμα:

Παράδειγμα

Βρείτε το αποτέλεσμα:
   LDI  R20, 0x35       ;R20 = 0x35
   ANDI  R20,  0x0F     ;R20 = R20 AND 0x0F
                        ; now  R20 = 0x05
      0x35                  0011 0101
AND   0x0F                  0000 1111
     ------              ----------------
      0x05                  0000 0101         

0x35 AND 0x0F = 0x05     Z = 0,    N = 0

Η λογική εντολή OR

OR  Rd, Rr    ;     Rd = Rd OR Rr

Αυτή η εντολή εκτελεί το λογικό OR σε δυο τελεστέους και τοποθετεί το αποτέλεσμα στο αριστερό τελεστέο. Επίσης υπάρχει η εντολή “OR  Rd, k” στην οποία ο δεξιός τελεστέος είναι μια σταθερή τιμή. Η εντολή OR επηρεάζει τις σημαίες Ζ, S, και Ν. Η σημαία Ν είναι το bit D7 του αποτελέσματος και Ζ=1 εάν το αποτέλεσμα είναι ίσο με μηδέν. Η εντολή OR μπορεί να χρησιμοποιηθεί για να θέσει κάποια bits του (αριστερού) τελεστέου σε 1.

Παράδειγμα

A]  Βρίτε τα αποτελέσματα του παρακάτω κώδικα
     LDI   R20, 0x04         ; R20 = 0x04
     ORI  R20, 0x30         ; now R20 = 0x34
B] Υποθέστε ότι το ΡΒ2 χρησιμοποιείται για να ελέγξει το φως της εξώπορτας και το ΡΒ5 για να ελέγξει  το φώς μέσα στο κτίριο. Δείξτε πώς να ανάψετε το φώς της εξώπορτας και να σβήσεται το φως του κτιρίου.

Α]        0x04                  0000 0100
    OR    0x30                  0011 0000
       --------------------------------------
          0x34                  0011 0100    0x04 OR 0x30 = 0x34,  Z=0 and  N=0

B]       SBI    DDRB, 2                   ; bit 2 of Port B is output
         SBI   DRRB, 5                    ; bit 5 of Port  B is output
         IN    R20, PORTB    ; move PORTB to R20. (Notice that we read 
                             ;the value of PORTB instead of PINB 
                             ;because we want to know the last value of PORTB
                             ; not the value of the AVR chip pins)
         ORI    R20, 0b00000100    ; set bit 2 of R20 to zero
         ANDI   R20, 0b11011111    ; clear bit 5 of R20 to zero
         OUT  PORTB, R20           ; out R20 to PORTB

HERE:     JMP  HERE                ; stop here

Η λογική εντολή EX-OR

  EOR   Rd, Rs      ;     Rd = Rd  XOR  Rs

Αυτή η εντολή εκτελεί τη λογική πράξη EX-OR με δυο τελεστέους και τοποθετεί το αποτέλεσμα στο αριστερό τελεστέο. Η εντολή EX-OR επηρεάζει τις σημαίες Z, S και N. Η σημαία Ν είναι το Bit D7 του αποτελέσματος και εάν Ζ = 1 το αποτέλεσμα είναι ίσο με μηδέν.

Παράδειγμα

Βρείτε τα αποτελέσματα του ακόλουθου κώδικα:

LDI  R20,  0x54
LDI  R21,  0x78
EOR  R20, R21

Λύση
       0x54          0101 0100
XOR    0x78          0111 1000
     ---------------------------
       0x2C          0010 1100  

0x54 XOR 0x78 = 0x2C,  Z=0, N=0

Η εντολή EX – OR μπορεί να χρησιμοποιηθεί για να δούμε εάν δυο καταχωρητές έχουν την ίδια τιμή. Η εντολή “EOR  R0, R1” εκτελεί EX – OR με τους καταχωρητές R0 και R1 και τοποθετεί το αποτέλεσμα στον καταχωρητή R0. Εάν και οι δυο καταχωρητές έχουν την ίδια τιμή, στον R0 τοποθετείται η τιμή 00 και η σημαία Ζ τίθεται σε 1 (Ζ=1). Μετά μπορούμε να χρησιμοποιήσουμε τις εντολές διακλάδωσης για να αποφασίσουμε για το αποτέλεσμα.

Παράδειγμα

Η εντολή EX-OR μπορεί να χρησιμοποιηθεί για να ελέγξουμε τα περιεχόμενα ενός καταχωρητή με μια γνωστή τιμή. Στον ακόλουθο κώδικα δείχνουμε πως χρησιμοποιούμε την εντολή EX-OR για να δούμε η τιμή ενός καταχωριτή είναι ίση με μια γνωστή τιμή, κάνοντας τη σημαία 1

OVER:    IN   R20, PINB
         LDI  R21, 0x45
         EOR  R20, R21
         BRNE  OVER

Λύση     0x45               0100 0101
         0x45               0100 0101
       --------            -----------------
          00                0000 0000 

Παράδειγμα

Διάβασε και έλεγξε το καταχωρητή PORTB για να δεις εάν έχει την τιμή 0x45. Εάν ναι στείλε την τιμή 0x99 στον καταχωρητή PORTC αλλιώς να τον θέσεις σε μηδέν.

Λύση
            LDI  R20, 0xFF      ; R20 = 0xFF
            OUT  DDRC, R20      ; Port C is output
            LDI  R20, 0x00      ; R20 = 0
            OUT  DDRB, R20      ; Port B is input
            OUT  PORTC, R20     ; PORTC = 00
            LDI  R21,  0x45     ; R21 = 0x45
HERE:
            IN   R20, PINB      ; get a byte
            EOR  R20, 21        ; EX-OR with 0x45
            BRNE  HERE          ; Branch if PORTB has value other than 0x45
            LDI  R20, 0x99      ; R20 = 0x99
            OUT  PORTC, R20     ; PORTC = 0x99
EXIT:       JMP  EXIT

Μια άλλη ευρέα χρήση της EX – OR είναι να εναλλάξουμε τα bits ενός τελεστέου:

LDI  R20, 0xFF
EOR  R0, R20    ;EX-OR R0 with 1111 1111 
                ;will change all the bits of R0 to opposite

COM(complement)

Αυτή η εντολή εναλλάσσει τα περιεχόμενα ενός καταχωρητή GPR. Η εναλλαγή των bits ενός καταχωρητή αλλάζει τα 0s σε 1s και τα 1s σε 0s. Αυτό ονομάζεται συμπλήρωμα ως προς ένα.

Μελετήστε το ακόλουθο παράδειγμα:

LDI R20, 0xAA          ; R20 = 0xAA
COM R20                ; now  R20 = 0x55

NEG(negate)

Αυτή η εντολή δίνει το συμπλήρωμα ως προς δυο από ένα καταχωρητή.

Παράδειγμα

Βρές το συμπλήρωμα ως προς δυο της τιμής 0x85. Σημειώστε ότι 0x85 είναι -123

LDI R21, 0x85              ; 0x85  =  1000 0101
                           ; 1’s   =  0111 1010
                           ;              +   1
NEG  R21                   ; 2’s comp 0111 1011 = 0x7B