📄 mcobcdtb.asm
字号:
;********************MCOBCDTB********************
;本程序实现多字节压缩BCD码转化为二进制数。
;入口参数:原BCD码数地址在SADR中,字节数在CNT中,相同字节数的结果存放地址在DADR中。
;出口参数:结果在指定地址中,字节数在CNT中。
;占用资源:W,FSR,STATUS,020H,022H,023H,028H,029H,02AH,02BH,两重堆栈。
IFNDEF MCOBCDTB1
#DEFINE MCOBCDTB1
MCOBCDTB MOVF CNT,W
MOVWF TEMP3
MOVF DADR,W
MOVWF FSR
LOOP23 CLRF INDF ;结果清0
INCF FSR,F
DECFSZ TEMP3,F
GOTO LOOP23
MOVF CNT,W
MOVWF TEMP3 ;重新找回字节数
DECF CNT,W
ADDWF SADR,F ;得到高位字节地址
LOOP26 MOVF SADR,W
MOVWF FSR
SWAPF INDF,W
CALL MUL_10
MOVF SADR,W
MOVWF FSR
MOVF INDF,W
CALL MUL_10
DECF SADR,F
DECFSZ TEMP3,F
GOTO LOOP26
MOVF DADR,W
MOVWF SADR ;出口
RETURN
;********************结果乘10子程序********************
MUL_10 MOVWF TEMP1
MOVLW 0FH
ANDWF TEMP1,F ;得到一位十进制数
MOVF CNT,W
MOVWF TEMP2
MOVF DADR,W
MOVWF FSR
CLRF TEMP4
LOOP25 RLF TEMP4,F ;TEMP4作为移出位缓存区
RLF INDF,F
RLF TEMP4,F
MOVF INDF,W ;结果乘以2暂存到W
RLF INDF,F
RLF TEMP4,F
RLF INDF,F
RLF TEMP4,F ;乘以8
BTFSS STATUS,C ;上次有无进位
GOTO NOC7
INCF INDF,F
BTFSC STATUS,Z
BSF TEMP4,7 ;加1又产生进位
BTFSS STATUS,Z
NOC7 BCF TEMP4,7
ADDWF INDF,F
RLF TEMP4,F
BTFSC STATUS,C
BSF TEMP4,0 ;保存进位
SWAPF TEMP4,F ;有用位移到顶端
INCF FSR,F
DECFSZ TEMP2,F
GOTO LOOP25 ;完成乘10的操作
MOVF CNT,W
MOVWF TEMP2 ;TEMP2作为计数器
MOVF DADR,W
MOVWF FSR
MOVF TEMP1,W
ADDWF INDF,F ;取出一个十进制位加到结果中
INCF FSR,F
DECF TEMP2,F
MOVLW 1
LOOP24 BTFSC STATUS,C
ADDWF INDF,F
INCF FSR,F
DECFSZ TEMP2,F
GOTO LOOP24
RETURN
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -