3.6.1 布尔(位)传送指令MOV
MOV指令用于将一个位变量的内容传送到另一个位变量。它既可以对位变量进行传送,也可以对位地址进行传送。
MOV指令的主要格式:
示例程序:
指令执行过程中会影响PSW中的进位标志位C(当目标操作数为C时)。
当直接寻址时,如果位地址为P0、P1、P2、P3时,程序执行过程中需要注意:
- 读取操作:先读取整个端口(8位),再从中取出所需的位
- 写入操作:必须先读取整个端口,修改所需的位,再写回整个端口
这是因为这些位属于特殊功能寄存器(SFR)中的I/O端口,必须按字节操作。例如:
这种操作方式被称为"读-修改-写"(Read-Modify-Write)操作。在多任务系统或中断处理中需要特别注意,因为这种操作不是原子操作,可能会导致竞争条件。
3.6.2 布尔(位)状态控制指令
布尔(Boolean)状态控制指令主要包括CLR(Clear)、SETB(Set Bit)和CPL(Complement)三种指令。这些指令用于直接改变位变量的状态。
1. CLR(Clear)指令
CLR指令用于将位变量清零(置为0)。
指令格式:
2. SETB(Set Bit)指令
SETB指令用于将位变量置1。
指令格式:
3. CPL(Complement)指令
CPL指令用于将位变量的值取反(0变1,1变0)。
指令格式:
示例程序:
这些指令在执行过程中也需要注意"读-修改-写"的特性,特别是在操作I/O端口位时。同时,当操作对象为进位位C时,这些指令会直接影响PSW中的进位标志位。
3.6.3 布尔(位)逻辑操作指令
布尔(位)逻辑操作指令包括ANL和ORL两种指令。正如在3.4 逻辑运算类指令中介绍的那样,这两个指令可用于位变量的逻辑运算。
1. ANL(与)指令
ANL指令用于对位变量进行逻辑"与"运算。在位操作中,它主要用于将进位位C与某个位变量进行与运算。
指令格式:
2. ORL(或)指令
ORL指令用于对位变量进行逻辑"或"运算。在位操作中,它主要用于将进位位C与某个位变量进行或运算。
指令格式:
示例程序:
这些指令执行过程中会直接影响PSW中的进位标志位C。当操作I/O端口位时,同样需要注意"读-修改-写"的特性。
3.6.4 布尔(位条件转移指令)
布尔条件转移指令用于根据位变量的状态进行程序跳转。这类指令包括:JC(Jump if Carry)、JNC(Jump if Not Carry)、JB(Jump if Bit)、JNB(Jump if Not Bit)和JBC(Jump if Bit and Clear)。
1. JC (Jump if Carry)和JNC (Jump if Not Carry)指令
这两个指令根据进位位C的状态进行条件跳转:
指令格式:
示例程序:
2. JB (Jump if Bit)和JNB (Jump if Not Bit)指令
这两个指令根据指定位变量的状态进行条件跳转:
指令格式:
示例程序:
3. JBC (Jump if Bit and Clear)指令
JBC(Jump if Bit and Clear)指令首先测试指定位,如果该位为1,则将其清零并跳转;如果该位为0,则继续执行下一条指令。
指令格式:
示例程序:
这些指令在执行过程中,当操作I/O端口位时也需要注意"读-修改-写"的特性。rel表示相对地址偏移量,跳转范围为当前程序计数器±127字节。