📄 mubcdtb.asm
字号:
;********************MUBCDTB********************
;本程序实现多字节非压缩BCD码转化为二进制数。
;入口参数:原BCD码数地址在SADR中,字节数在CNT中,CNT/2或(CNT/2+1)个字节的结果
; 存放地址在DADR中。
;出口参数:结果在指定单元中,地址在SADR中,字节数在CNT中。
;占用资源:W,FSR,STATUS,020H,022H,023H,028H,029H,02AH,02BH,两重堆栈。
;说 明:1.SADR和DADR内容不要相同。
; 2.原数据不变。
IFNDEF MUBCDTB1
#DEFINE MUBCDTB1
MUBCDTB MOVF CNT,W
MOVWF TEMP3 ;TEMP3永久存放字节数
BCF STATUS,C
RRF CNT,F
BTFSC STATUS,C
INCF CNT,F ;字节数除以2得到结果字节数
MOVF DADR,W
MOVWF FSR
LOOP27 CLRF INDF ;结果清0
INCF FSR,F
DECFSZ CNT,F
GOTO LOOP27
MOVF TEMP3,W
MOVWF CNT ;重新找回字节数
BCF STATUS,C
RRF TEMP3,F
BTFSC STATUS,C
INCF TEMP3,F ;字节数除以2得到结果字节数
DECF CNT,W
ADDWF SADR,F ;得到高位字节地址
LOOP30 MOVF SADR,W
MOVWF FSR
MOVF INDF,W
CALL MUL1_10
DECF SADR,F
DECFSZ CNT,F
GOTO LOOP30
MOVF DADR,W
MOVWF SADR
MOVF TEMP3,W
MOVWF CNT ;结果字节数
RETURN
;********************结果乘10子程序********************
MUL1_10 MOVWF TEMP1 ;得到一位十进制数
MOVF TEMP3,W
MOVWF TEMP2
MOVF DADR,W
MOVWF FSR
CLRF TEMP4
LOOP29 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 NOC8
INCF INDF,F
BTFSC STATUS,Z
BSF TEMP4,7 ;加1又产生进位
BTFSS STATUS,Z
NOC8 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 LOOP29 ;完成乘10的操作
MOVF TEMP3,W
MOVWF TEMP2 ;TEMP2作为计数器
MOVF DADR,W
MOVWF FSR
MOVF TEMP1,W
ADDWF INDF,F ;取出一个十进制位加到结果中
INCF FSR,F
DECF TEMP2,F
MOVLW 1
LOOP28 BTFSC STATUS,C
ADDWF INDF,F
DECFSZ TEMP2,F
GOTO LOOP28
RETURN
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -