逻辑运算指令分为两类:一类是以A为目的操作数寄存器,一类是以直接地址为目的操作数,但其操作都是将目的操作数与源操作数按位进行位逻辑运算,操作结果送往目的操作数。这类指令不影响PSW中各个标志位。
ANL A,Rn ;A←A Rn
ANL A,direct ;A←A(direct)
ANL A,@Ri ;A←A(Ri)
ANL A,#data ;A←A#data
ANL direct,A ;(direct) ←(direct)A
ANL direct,#data ;(direct) ←(direct)#data
例如,设A=23H,(20H)=81H,执行ANL A,20H后,A=01H。
ORL A,Rn ;A←ARn
ORL A,direct ;A←A (direct)
ORL A,Ri ;A←A (Ri)
ORL A,#data ;A←A#data
ORL direct,A ;(direct) ←(direct)A
ORL direct,#data ;(direct) ←(direct)#data
例如,设A=24H,(20H)=40H,执行ORL A,20H后,A=64H。
XRL A,Rn ;A←ARn
XRL A,direct ;A←A(direct)
XRL A,@Ri ;A←A((Ri))
XRL A,#data ;A←A#data
XRL direct,A ;(direct) ←(direct)A
XRL direct,#data ;(direct) ←(direct)#data
(1)累加器A求反与清除指令。
CPL A ;A←
CLR A ;A←0
例如,设A=23H,执行CPL A后,A=DCH。
(2)循环移位指令。
MCS-51的移位指令只能对累加器A进行,分为带进位和不带进位两类移位指令。
①循环左移。
RL A ;将累加器A的内容循环左移1位
②循环右移。
RR A ;将累加器A的内容循环右移1位
③带进位的循环左移。
RLC A ;将累加器A的内容连同进位位CY循环左移1位
④带进位的循环右移。
RRC A ;将累加器A的内容连同进位位CY循环右移1位
例如,设A=20H,执行RL A指令后,A中各位数据向左移动1位,D7位数据进入D0位,A=40H。
又如,设A=20H,执行RR A指令后,A中各位数据向右移动1位,D0位数据进入D7位,A=10H。
【例3-10】将累加器A中的压缩BCD码分为两个字节,形成非压缩BCD码,放入40H和41H单元中。
解:由题意,将累加器A中的低4位保留,高4位清零放入40H;高4位保留,低4位清零,半字节交换后存入41H单元中。程序如下。
MOV R0,A ;保存A中的内容到R0
ANL A,#00001111B ;高4位清零,保留低4位不变
MOV 40H,A ;将形成的低4位非压缩BCD码存入40H
MOV A,R0 ;取原数据
ANL A,#11110000B ;保留高4位不变,清低4位
SWAP A ;将高低4位交换
MOV 41H,A ;将高4位非压缩BCD码存入41H
【例3-11】P1口高4位不变,把累加器A中的低4位由P1口的低4位输出。
解:据题意程序如下。
ANL A,#00001111B ;将A的高4位清零
MOV R0,A ;将A保存在R0
MOV A,P1 ;P1读入A
ANL A,#11ll0000B ;高4位不变
ORL A,R0 ;将A的低4位和P1口的高4位组成一个字节
MOV P1,A ;送P1口输出
逻辑操作类指令除带进位的左(右)循环移位外,只对标志位P产生影响,且多为单周期指令。逻辑操作类指令汇总表如表3-5所示。
表3-5 逻辑运算类指令一览表
助 记 符 |
功能说明 |
字 节 数 |
振荡器周期 |
ANL A,Rn |
寄存器“与”到累加器 |
1 |
12 |
续上表
助 记 符 |
功能说明 |
字 节 数 |
振荡器周期 |
ANL A,direct |
直接寻址字节“与”到累加器 |
2 |
12 |
ANL A,@Ri |
间接寻址RAM“与”到累加器 |
1 |
12 |
ANL A,#data |
立即数“与”到累加器 |
2 |
12 |
ANL direct,A |
累加器“与”到直接寻址字节 |
2 |
12 |
ANL direct,#data |
立即数“与”到直接寻址字节 |
3 |
24 |
ORL A,@Rn |
寄存器“与”到累加器 |
1 |
12 |
ORL A,#direct |
直接寻址字节“或”到累加器 |
2 |
12 |
ORL A,Ri |
间接寻址RAM“或”到累加器 |
1 |
12 |
ORL A,#data |
立即数“或”到累加器 |
2 |
12 |
ORL direct,A |
累加器“或”到直接寻址字节 |
2 |
12 |
ORL direct,#data |
立即数“或”到直接寻址字节 |
3 |
24 |
XRL A,Rn |
寄存器“异或”到累加器 |
1 |
12 |
XRL A,direct |
直接寻址字节“异或”到累加器 |
2 |
12 |
XRL A,@Ri |
间接寻址RAM“异或”到累加器 |
1 |
12 |
XRL A,#data |
立即数“异或”到累加器 |
2 |
12 |
XRL direct,A |
累加器“异或”到直接寻址字节 |
2 |
12 |
XRL direct,#data |
立即数“异或”到直接寻址字节 |
3 |
24 |
RL A |
累加器循环左移 |
1 |
12 |
RLC A |
经过进位位的累加器循环左移 |
1 |
12 |
RR A |
累加器循环右移 |
1 |
12 |
RRC A |
经过进位位的累加器循环右移 |
1 |
12 |
CLR A |
累加器清零 |
1 |
12 |
CPL A |
累加器求反 |
1 |
12 |