逻辑运算类指令
逻辑运算类指令共24条,包括与、或、异或、清零、取反、循环移位等操作指令,见表3-5。
逻辑运算类指令执行时一般不影响程序状态寄存器PSW中的相应位,只有两种情况除外,那就是当目的操作数为A时会影响奇偶标志P位;带进位循环移位指令会影响CY位。逻辑运算指令用到的助记符有ANL、ORL、XRL、RL、RLC、RR、RRC、CLR和CPL,共9种。
1.逻辑与运算指令(ANL)(第1~第6条)
逻辑“与”运算指令共6条,是将目的操作数的内容与源操作数进行按位逻辑“与运算”,结果送回源操作数中。对后2条指令而言,若直接地址是输出口数据锁存器P0~P3时,属于“读—修改—写”指令。
【例3-21】已知(20H)=47H,将内部20H单元的低4位清0,高4位保持不变,指令为如下:
执行结果:(20H)=40H,可见与‘0’进行与操作的位被清零;与‘1’进行与操作的位保持不变。
表3-5 MCS-51逻辑运算指令表
2.逻辑或运算指令(ORL)(第7~第12条)
这组指令是将目的操作数与源操作数所指示的内容按位进行逻辑“或”运算,结果存入目的操作数中,第7~第10条指令执行后影响P位。对后2条指令而言,若直接地址是输出口数据锁存器P0~P3时,属于“读—修改—写”指令。
【例3-22】已知P1口的内容为P1=10110001B,欲将其第1位和第2位置位,即使D2D1=11,其余位保持不变,可执行指令:
ORL P1,#00000110B
执行结果:P1=10110111B。可见与‘1’进行或操作的位被置位;与‘0’进行或操作的位保持不变。
3.逻辑异或运算指令(XRL)(第13~第18条)
这组指令的前4条指令是将目的操作数与源操作数进行按位“异或”,其结果存入目的操作数中。对后2条指令而言,若直接地址是输出口数据锁存器P0~P3时,属于“读—修改—写”指令。
【例3-23】已知A=0F0H,R5=73H。
执行指令: XRL A,R5
执行结果:A=83H,R5=73H,P=1。可见与“0”相“异或”,该位保持不变;与“1”相“异或”,该位取反。因此逻辑异或操作常用于使某个单元中的特定位取反,而不影响其他位的值。
当执行表3-5中与、或、异或三种指令各自的最后一条指令时,可以对片内RAM的任何一个单元、特殊功能寄存器以及端口的特定位进行位复位、位置位或位取反操作。
4.求反指令(CPL)(第19条)
本指令是将A中的内容各位取反,结果送回A中。
5.清0指令(CLR)(第20条)
本指令是将A的内容清0。
6.循环移位指令(第21~第24条)
(1)RL A。循环左移指令。这条指令的功能是把累加器A中的每一位逐位向左移一位,第7位循环移入第0位,不影响标志位。其功能如下所示:
(2)RLC A。带进位循环左移指令。这条指令的功能是把累加器A中的内容和进位标志一起逐位向左移一位,第7位循环移入CY位,原CY位移入第0位,影响PSW中的进位位CY和奇偶状态标志位P。其功能如下所示:
(3)RR A。循环右移指令。这条指令的功能是把累加器A中的每一位逐位向右移一位,第0位循环移入第7位,不影响标志位。其功能如下所示:
(4)RRC A。带进位循环右移指令。这条指令的功能是把累加器A中的内容和进位标志一起向右移一位,第0位循环移入CY位,原CY位移入第7位,影响PSW中的进位位CY和奇偶状态标志位P。其功能如下所示:
【例3-24】已知A=01100110B=66H,CY=0,欲将A中的内容除2,可执行指令:
RRC A
执行结果:A=00110011B=33H,CY=0,33H正是66H的1/2。
【例3-25】已知A=10111101B=0BDH,CY=0,欲将A中的内容乘2,可执行指令:
RLC A
执行结果:A=01111010B=7AH,CY=1,17AH正是0BDH的2倍。可见通常都可以用“RRC A”这一指令使A中的内容做除2运算;用“RLC A”这一指令使A中的内容做乘2运算。