1. 逻辑运算指令的一般性说明
* 与、或、异或的逻辑运算指令可以Acc或direct为目标。但是以direct为目标时,另一操作数只能是Acc或立即数。
* 与、或、异或是对位逻辑运算。
* 其他逻辑运算指令只对Acc操作。
* 小循环不影响Cy,大循环Cy在循环圈内。
* 除了RLC和RRC,逻辑运算指令不影响P以外的标志位。
2. 与、或、异或的特殊用途
* 用ANL指令屏蔽指定位
例:ANL A,#0FH ;屏蔽高4位
* 用ORL指令将指定位置1
例:ORL A,#0FH ;将低4位置1
* 用ORL指令拼接一个字节
例:ANL A,#0FH
ANL B,#0F0H
ORL A,B
* 用XRL指令将指定位取反
例:XRL A,#55H ;将D0、D2、D4、D6等位取反
表 3-4 逻辑运算指令
| 操作码 | 目标操作数 | 参与运算的操作数 | 说 明 |
| ANL | A | Rn; direct; @Ri; # data | 逻辑与 |
| direct | A; # data |
ORL | A | Rn; direct; @Ri; # data | 逻辑或 |
| direct | A; # data |
XRL | A | Rn; direct; @Ri; # data | 逻辑异或 |
| direct | A; # data |
| CPL | A | — | 累加器(A)取反 |
| CLR | A | — | 累加器(A)清零 |
 RL | A | (A)左小循环,不影响Cy |
|  RLC | A | ← (A)左大循环 |
|  RR | A | (A)右小循环,不影响Cy |
|  RRC | A | → (A)右大循环 |
3. 循环移位逻辑运算指令的应用
* 乘除法运算
左移=无符号数乘2,右移=有符号数除2。
例:A×B,积存(BA)
算法:乘数在(A),积在(R2)(A)。
1) (A)右移一位;
2) (A)移出的一位若为1,则(R2)+被乘数(B);
3) 积(R2)(A)双字节右移一位;第2、3步循环8次。
为简化,假定为4位,循环4次。(A)=1011, (B)=1111
MOV R2,#0
MOV R3,#8
CLR C
RRC A
LP:XCH A,R2
JNC RRR
ADD A,B
RRR:RRC A
XCH A,R2 ;①
RRC A ;②
DJNZ R3,LP
MOV B,R2
下表第一列为:循环次数-执行点
其余各列为逻辑运算指令执行点的操作结果。
|
| | 循环 | R2 | C | A | C | | 初态 | 0000 | ― | 0101 | 1 | | 1-① | 0111 | 1 | 0101 | ― | | 1-② | 0111 | ― | 1010 | 1 | | 2-① | 1011 | 0 | 1010 | ― | | 2-② | 1011 | ― | 0101 | 0 | | 3-① | 0101 | 1 | 0101 | ― | | 3-② | 0101 | ― | 1010 | 1 | | 4-① | 1010 | 1 | 1010 | ― | | 4-② | 1010 | ― | 0101 | 0 | | |
逻辑尺以二进制数表示二值逻辑序列,逐位移出,并据此行逻辑控制。