?? 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 + -