Εκτός από τις Ι/Ο και τις αριθμητικές εντολές, οι λογικές εντολές είναι μερικές από τις πιο ευρέα χρησιμοποιούμενες εντολές. Σε αυτή την ενότητα καλύπτουμε τις Boolean λογικές εντολές όπως οι AND, OR, Exclusive – OR (XOR) και το συμπλήρωμα. Αυτές οι εντολές εφαρμόζονται στα bits των αντίστοιχων θέσεων των δυο καταχωρητών.
Η λογική εντολή AND
AND Rd, Rr ; Rd = Rd AND Rr
Αυτή η εντολή εκτελεί το λογικό AND πάνω σε δυο τελεστέους (GPRs) και τοποθετεί το αποτέλεσμα στο αριστερό τελεστέο. Επίσης υπάρχει και η εντολή “ANDI 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 σε δυο τελεστέους και τοποθετεί το αποτέλεσμα στο αριστερό τελεστέο. Επίσης υπάρχει η εντολή “ORI 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 για να δούμε εάν η τιμή ενός καταχωρητή είναι ίση με μια γνωστή τιμή, εξετάζοντας την σημαία Ζ.
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, R21 ; 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