📄 multibyte_bcd_sub.asm
字号:
;---------------------------------------------多字节十进制减法
入口:运算字节长度 B_COUNT ,TEMP2 :被减数低字节地址 ,TEMP3 :减数低字节地址
出口:被减数区为结果
MULTIBYTE_BCD_SUB;###############################
MOVF TEMP3,W
MOVWF FSR
MOVF INDF,W
MOVWF TEMP1
MOVF TEMP2,W
MOVWF FSR
MOVF INDF,W
MOVWF TEMP
CALL BCD_SUB
MOVF TEMP,W
MOVWF INDF
BTFSS TEMP1,0x00
GOTO NO_CARRY_HAPPEN ;无借位产生
MOVLW 0x01
SUBWF B_COUNT,W
BTFSC STATUS,Z
GOTO NO_CARRY_HAPPEN ;最高字节运算
MOVWF COUNT
MOVF TEMP2,W
MOVWF FSR
DECF FSR,F
SUB_CARRY_BIT
MOVF INDF,W
MOVWF TEMP
CALL BCD_SUB
MOVF TEMP,W
MOVWF INDF
DECF FSR,F
DECFSZ COUNT,F
GOTO SUB_CARRY_BIT
BTFSC TEMP1,0x00
GOTO MULTIBYTE_BCD_SUB_END ;最高位产生借位,运算失败
NO_CARRY_HAPPEN
DECF TEMP2,F
DECF TEMP3,F
DECFSZ B_COUNT,F
GOTO MULTIBYTE_BCD_SUB
MULTIBYTE_BCD_SUB_END
RETURN
;---------------------------------------------十进制减法子程序
BCD_SUB;######################################
;入口:被减数TEMP,减数TEMP1; 出口:结果TEMP,借位位TEMP1
;---------------------------------------------
MOVF TEMP1,W
SUBWF TEMP,F
CLRF TEMP1
RLF TEMP1,F ;借位送入
BTFSS STATUS,DC
GOTO SUBJUST ;DC=1
BTFSS TEMP,0x03 ;LSD>9?
GOTO BCD_SUB_END1
BTFSC TEMP,0x02
GOTO SUBJUST
BTFSS TEMP,0x01
GOTO BCD_SUB_END1
SUBJUST
MOVLW 0x06
SUBWF TEMP,F
BCD_SUB_END1
BTFSS TEMP1,0x00
GOTO BCD_SUB_END2
CLRF TEMP1
BTFSS TEMP,0x07 ;MSD>9?
GOTO BCD_SUB_END
BTFSC TEMP,0x06
GOTO BCD_SUB_END2
BTFSS TEMP,0x05
GOTO BCD_SUB_END
BCD_SUB_END2
MOVLW 0x60
SUBWF TEMP,F ;假设MSD>9
CLRF TEMP1
BTFSS STATUS,C
RETURN
MOVLW 0x01
MOVWF TEMP1
BCD_SUB_END
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -