Rotate and Swap Operations
The ability to rotate data is useful for inspecting bits of a byte without using individual bit opcodes. The A register can be rotated one bit position to the left or right with or without including the C flag in the rotation. If the C flag is not included, then the rotation involves the eight bits of the A register. If the C flag is included, then nine bits are involved in the rotation. Including the C flag enables the programmer to construct rotate operations involving any number of bytes.
The SWAP instruction can be thought of as a rotation of nibbles in the A register.
Figure 4.2 diagrams the rotate and swap operations. which are given in the following table:
Mnemonic |
Operation |
RL A |
Rotate the A register one bit position to the left; bit A0 to bit A I, A I to A2. A2 to A3. A3 to A4, A4 to A5, A5 to A6. A6 to A 7, and A 7 to A0 |
RLC A |
Rotate the A register and the carry flag. as a ninth bit, one bit position to the left; bit A0 to bit Al, Al to A2, A2 to A3, A3 to A4, A4 to A5. A5 to A6, A6 to A 7, A 7 to the carry flag, and the carry flag to A0 |
RR A |
Rotate the A register one bit position to the right; bit A0 to bit A 7, A6 to A5, A5 to A4, A4 to A3, A3 to A2. A2 to Al, and At to A0 |
RRC A |
Rotate the A register and the carry flag, as a ninth bit, one bit position to the right; bit A0 to the carry flag. carry flag to A 7, A 7 to A6, A6 to A5, A5 to A4, A4 to A3, A3 to A2, A2 to Al, and Al to A0 |
SWAP A |
Interchange the nibbles of register A; put the high nibble in the low nibble position and the low nibble in the high nibble position |
Note that no flags. other than the carry flag in RRC and RLC, are affected. If the carry is used as part of a rotate instruction, the state of the carry flag should be known before the rotate is done.
The following table shows examples of rotate and swap operations:
Mnemonic |
Operation |
OY A,#OA5h |
A = I0l00I0lb = A5h |
RR A |
A = I I0I00I0b = D2h |
RR A |
A = 0l I0l00lb = 69h |
RR A |
A = I0I l0I00b = B4h |
RR A |
A = 0I0l I0I0b = 5Ah |
SWAP A |
A= I0I00I0lb = A5h |
CLR C |
C = 0; A = I0I00I0lb = A5h |
RRC A |
C = I; A= 0I0I00I0b = 52h |
RRC A |
C = 0; A = l0I0J00lb = A9h |
RL A |
A= 0I0I00llb = 53h |
RL A |
A = I0I00l I0b = A6h |
SWAP A |
C = 0; A = 0l 101010b = 6Ah |
RLC A |
C = 0; A = 1 I0I0l00b = D4h |
RLC A |
C = l; A= I0I0l000b = A8h |
SWAP A |
C = l; A= l000I0I0b = 8Ah |
CAUTION
Know the state of the carry flag when using RRC or RRL.
Rotation and swap operations are limited to the A register.
Example Programs on 8051 Logical Operations
The programs in this section are written using only opcodes covered to this point in the text. The challenge is to minimize the number of lines of code.
Ø EXAMPLE PROBLEM 4. 1
Double the number in register R2, and put the result in registers R3 (high byte) and R4 (low byte).
Thoughts on the Problem The largest number in R2 is FFh; the largest result is 1 FEh. There are at least three ways to solve this problem: Use the MUL instruction (multiply, covered in Chapter 5). add R2 to itself, or shift R2 left one time. The solution that shifts R2 left is as follows:
Mnemonic |
Operation |
MOY R3,#00h |
Clear R3 to receive high byte |
CLRC |
Clear the carry to receive high bit of 2 x R2 |
MOY A.R2 |
Get R2 to A |
RLC A |
Rotate left, which doubles the number in A |
MOY R4,A |
Put low byte of result in R4 |
CLR A |
Clear A to receive carry |
RLC A |
|
MOY R3.A |
|
The carry bit is now bit 0 of A |
|
Transfer any carry bit to R3 |
|
COMMENT
Note how the carry flag has to be cleared to a known state before being used in a rotate operation.
Ø EXAMPLE PROBLEM 4.2
OR the contents of pons I and 2; put the result in external RAM location 0I00h.
· Thoughts on the Problem The ports should be input ports for this problem to make any physical sense; otherwise, we would not know whether to use the pin data or the port SFR latch data.
The solution is as follows:
Mnemonic |
Operation |
MOY A,90h |
Copy the pin data from port 1 to A |
ORL A,0A0h |
OR the contents of A with port 2; results in A |
MOY DPTR,#0100h |
Set the DPTR to point to external RAM address |
MOYX @DPTR.A |
Store the result |
COMMENT
Any time the port is the source of data, the pin levels are read; when the port is the destination, the latch is written. If the port is both source and destination (read-modify-write instructions), then the latch is used.
Ø EXAMPLE PROBLEM 4.3
Find a number that, when X0 Red to the A register, results in the number 3Fh in A.
· Thoughts on the Problem Any number can be in A, so we will work backwards:
3Fh =A XOR N
A XOR 3Fh = A XOR A XOR N = N
The solution is as follows:
Mnemonic |
Operation |
MOV R0,A |
Save A in R0 |
XOR A,#3Fh |
XOR A and 3Fh; forming N |
XOR A,R0 |
XOR A and N yielding 3Fh |
COMMENT
Does this program work? Let’s try several A’s and see.
A= FFh |
A XOR 3Fh = C0h |
C0h XOR FFh = 3Fh |
A= 00h |
A XOR 3Fh = 3Fh |
3Fh XOR 00h = 3Fh |
A= 5Ah |
A XOR 3Fh = 65h |
65h XOR 5Ah = 3Fh |
Summary
Boolean logic, rotate, and swap instructions are covered in this chapter. Byte-level operations involve each individual bit of a source byte operating on the same bit position in the destination byte; the results are put in the destination, while the source is not changed:
ANL destination. Source
ORL destination. Source
XRL destination. Source
CLR A
CPL A
RR A
RLA
RRCA
RLC A
SWAP A
Bit-level operations involve individual bits found in one area of internal RAM and certain SFRs that may be addressed both by the assigned direct-byte address and eight individual bit addresses. The following Boolean logical operations may be done on each of these addressable bits:
ANLbit
ORL bit
CLR bit
CPL bit
SETB bit
MOY destination bit, source bit
Problems
Write programs that perform the tasks listed using only opcodes that have been discussed in this and previous chapters. Write comments for each line of code and try to use as few lines as possible.
1. Set Port 0. bits 1,3,5, and 7. to one: set the rest to zero.
2. Clear bit 3 of RAM location 22h without affecting any other bit.
3. Invert the data on the port 0 pins and write the data to port I.
4. Swap the nibbles of R0 and RI so that the low nibble of R0 swaps with the high nibble of RI and the high nibble of R0 swaps with the low nibble of R l .
5. Complement the lower nibble of RAM location 2Ah.
6. Make the low nibble of RS the complement of the high nibble of R6.
7. Make the high nibble of RS the complement of the low nibble of R6.
8. Move bit 6 of R0 to bit 3 of port 3.
9. Move bit 4 of RAM location 30h to bit 2 of A. to. XOR a number with whatever is in A so that the result is FFh.
11. Store the most significant nibble of A in both nibbles of register RS: for example, if A = B6h. then RS = BBh.
12. Store the least significant nibble of A in both nibbles of RAM address 3Ch; for example. if A = 36h. then 3Ch = 66h.
13. Set the carry flag to one if the number in A is even; set the carry flag to zero if the number in A is odd.
14. Treat registers R0 and RI as 16-bit registers, and rotate them one place to the left: bit 7 of R0 becomes bit 0 of RI. bit 7 of RI becomes bit 0 of R0, and so on.
15. Repeat Problem 14 but rotate the registers one place to the right.
16. Rotate the DPTR one place to the left; bit IS becomes bit 0.
17. Repeat problem 16 but rotate the DPTR one place to the right.
18. Shift register B one place to the left: bit 0 becomes a zero. bit 6 becomes bit 7. and so on. Bit 7 is lost.