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