查阅PIC单片机芯片手册,关于进位/借位位的说明为:
C:进位/借位位。
1 = 结果的最高位发生了进位
0 = 结果的最高位未发生进位
同时有一条标注:借位的极性是相反的。
通过以上说明,可以将C的分析分为两种情况:
1、加法:
最高位发生了进位:C = 1;
最高位未发生进位:C = 0;
2、减法:
最高位发生了借位:C = 0;
最高位未发生借位:C = 1;
为了加深理解,在MPLAB中写入一段代码,通过观测STATUS寄存器的值来测试以上分析:
;测试SUBWF、ADDWF指令与状态寄存器C标志位的关系 LIST P=16F684
include "P16F684.INC" Sub_Register_Small EQU 20H
Sub_Register_Large EQU 21H
Add_Register EQU 22H
Small_Status EQU 23H
Large_Status EQU 24H
Add_Status EQU 25H ;被减数 < 减数
MOVLW 54H
MOVWF Sub_Register_Small
MOVLW 66H
SUBWF Sub_Register_Small, F SWAPF STATUS, W ;保存状态寄存器值
MOVWF Small_Status
SWAPF Small_Status, F ;被减数 > 减数
MOVLW 77H
MOVWF Sub_Register_Large
MOVLW 66H
SUBWF Sub_Register_Large, F SWAPF STATUS, W ;保存状态寄存器值
MOVWF Large_Status
SWAPF Large_Status, F ;加法进位
MOVLW 77H
MOVWF Add_Register
MOVLW 0BBH
ADDWF Add_Register, F SWAPF STATUS, W ;保存状态寄存器值
MOVWF Add_Status
SWAPF Add_Status, F END
启用仿真后,查看内存23H、24H、25H(保存的是以上三种操作后的STATUS)的值,结果如下:
Small_Status : 00011000B,对应C=0(最高位发生了借位)
Large_Status : 00011011B,对应C=1(最高位未发生借位)
Add_Status : 00011011B,对应C=1(最高位发生了进位)
为了简单便于记忆,可以把C的进/借位规则记为:加柴(1)做煎(减)蛋(0)!