asm51汇编子程序(有关多字节无符号整数bcd码运算部分)

;==============================================================================
;多字节二进制整数转换为十进制整数子程序NIBTD
;入口:R0指向多字节二进制整数高位,R1指向结果多字节十进制整数高位,R7=n
;使用A,B,R0~R7,影响CY
;==============================================================================
NIBTD:          MOV     A,R0
                MOV     R5,A
                MOV     A,R1
                MOV     R6,A
                MOV     A,R7
                MOV     R3,A
                CLR     A
NBD0:           MOV     @R1,A
                INC     R1
                DJNZ    R3,NBD0
                MOV     A,R7
                MOV     B,#8
                MUL     AB
                MOV     R3,A
NBD4:           MOV     A,R5
                ADD     A,R7
                DEC     A
                MOV     R0,A
                MOV     A,R7
                MOV     R2,A
                CLR     C
NBD1:           MOV     A,@R0
                RLC     A
                MOV     @R0,A
                DEC     R0
                DJNZ    R2,NBD1
                PUSH    PSW
                MOV     A,R6
                ADD     A,R7
                DEC     A
                MOV     R1,A
                POP     PSW
                MOV     A,R7
                MOV     R2,A
NBD3:           MOV     A,@R1
                ADDC    A,@R1
                DA      A
                MOV     @R1,A
                DEC     R1
                DJNZ    R2,NBD3
                DJNZ    R3,NBD4
                RET
;==============================================================================

;==============================================================================
;多字节十进制整数转换为二进制整数子程序NIDTB
;入口:R0指向多字节十进制整数高位,R1指向结果多字节二进制整数高位,R7=n
;使用A,B,R0~R7,影响CY
;==============================================================================
NIDTB:          MOV     A,R1
                MOV     R6,A
                MOV     A,R7
                MOV     R3,A
                CLR     A
NDB0:           MOV     @R1,A
                INC     R1
                DJNZ    R3,NDB0
                MOV     A,R7
                MOV     R3,A
NDB3:           CALL   NDB1
                MOV     A,@R0
                ANL     A,#0F0H
                SWAP    A
                CALL   NDB2
                CALL   NDB1
                MOV     A,@R0
                ANL     A,#0FH
                CALL   NDB2
                INC     R0
                DJNZ    R3,NDB3
                RET
NDB1:           MOV     A,R7
                MOV     R4,A
                MOV     A,R6
                ADD     A,R7
                DEC     A
                MOV     R1,A
                CLR     C
                MOV     R2,#0
NDB4:           MOV     A,@R1
                MOV     B,#10
                PUSH    PSW
                MUL     AB
                POP     PSW
                ADDC    A,R2
                MOV     @R1,A
                MOV     R2,B
                DEC     R1
                DJNZ    R4,NDB4
                RET
NDB2:           MOV     R5,A
                MOV     A,R6
                ADD     A,R7
                DEC     A
                MOV     R1,A
                MOV     A,R7
                MOV     R4,A
                MOV     A,R5
                ADD     A,@R1
                MOV     @R1,A
                DEC     R1
                DJNZ    R4,NDB5
                RET
NDB5:           MOV     A,@R1
                ADDC    A,#0
                MOV     @R1,A
                DEC     R1
                DJNZ    R4,NDB5
                RET
;==============================================================================

;==============================================================================
;单字节BCD码转换成压缩BCD码子程序BCDC
;入口:R0指向2n个单字节高位,R1指向n个双字节高位,R3=n
;使用A,R0,R1,R3
;==============================================================================
BCDC:           MOV     A,@R0
                SWAP    A
                INC     R0
                ORL     A,@R0
                MOV     @R1,A
                INC     R0
                INC     R1
                DJNZ    R3,BCDC
                RET
;==============================================================================

;==============================================================================
;压缩BCD码转换成单字节BCD码子程序CBCD
;入口:R0指向n个双字节高位,R1指向2n个单字节高位,R3=n
;使用A,R0,R1,R3
;==============================================================================
CBCD:           MOV     A,@R0
                SWAP    A
                ANL     A,#0FH
                MOV     @R1,A
                INC     R1
                MOV     A,@R0
                ANL     A,#0FH
                MOV     @R1,A
                INC     R0
                INC     R1
                DJNZ    R3,CBCD
                RET
;==============================================================================

;==============================================================================
;多字节十进制加法子程序CADD
;入口:RO指向被加数n字节压缩BCD码高位,R1指向加数n字节压缩BCD码高位,R3=n
;结果:和数压缩BCD码放入R0指向的n个字节
;使用A,R0,R1,R3,影响CY
;==============================================================================
CADD:           MOV     A,R0
                ADD     A,R3
                DEC     A
                MOV     R0,A
                MOV     A,R1
                ADD     A,R3
                DEC     A
                MOV     R1,A
                CLR     C
CADL:           MOV     A,@R0
                ADDC    A,@R1
                DA      A
                MOV     @R0,A
                DEC     R0
                DEC     R1
                DJNZ    R3,CADL
                RET
;==============================================================================

;==============================================================================
;多字节十进制减法子程序CSUB1
;入口:RO指向被减数n字节压缩BCD码高位,R1指向减数n字节压缩BCD码高位,R3=n
;结果:差数压缩BCD码放入R0指向的n个字节
;使用A,R0,R1,R3,影响CY,CY=1结果为正;CY=0结果为负
;==============================================================================
CSUB1:          MOV     A,R0
                ADD     A,R3
                DEC     A
                MOV     R0,A
                MOV     A,R1
                ADD     A,R3
                DEC     A
                MOV     R1,A
                SETB    C
CSUL1:          CLR     A
                ADDC    A,#99H
                SUBB    A,@R1
                ADD     A,@R0
                DA      A
                MOV     @R0,A
                DEC     R0
                DEC     R1
                DJNZ    R3,CSUL1
                RET
;==============================================================================

;==============================================================================
;多字节十进制乘法子程序CMUL
;入口:RO指向被乘数n字节压缩BCD码高位,R1指向乘数n字节压缩BCD码高位,R3=n
;结果:积数压缩BCD码放入R0指向的2n个字节
;使用A,R0,R1,R2,R3,R6,R7,影响CY
;==============================================================================
CMUL:           MOV     A,R3
                MOV     R6,A
                ADD     A,R3
                MOV     R2,A
                MOV     A,R1
                ADD     A,R3
                DEC     A
                MOV     R1,A
                MOV     A,R0
                ADD     A,R3
                MOV     R0,A
                CLR     A
CMUL1:          MOV     @R0,A
                INC     R0
                DJNZ    R6,CMUL1
                DEC     R0
                MOV     A,R2
                MOV     R6,A
CMUL2:          CLR     A
CMUL3:          XCH     A,@R0
                SWAP    A
                XCHD    A,@R0
                XCH     A,@R0
                DEC     R0
                DJNZ    R2,CMUL3
                MOV     R7,A
                JZ      CMUL7
CMUL4:          MOV     A,R3
                MOV     R2,A
                ADD     A,R3
                ADD     A,R0
                MOV     R0,A
                CLR     C
CMUL5:          MOV     A,@R0
                ADDC    A,@R1
                DA      A
                MOV     @R0,A
                DEC     R0
                DEC     R1
                DJNZ    R2,CMUL5
                MOV     A,R3
                MOV     R2,A
CMUL6:          CLR     A
                ADDC    A,@R0
                DA      A
                MOV     @R0,A
                DEC     R0
                DJNZ    R2,CMUL6
                MOV     A,R1
                ADD     A,R3
                MOV     R1,A
                DJNZ    R7,CMUL4
CMUL7:          MOV     A,R3
                ADD     A,R3
                MOV     R2,A
                ADD     A,R0
                MOV     R0,A
                DJNZ    R6,CMUL2
                RET
;==============================================================================

;==============================================================================
;多字节十进制除法子程序CDIV
;入口:RO指向被除数2n字节压缩BCD码高位,R1指向除数n字节压缩BCD码高位,R3=n
;结果:商数压缩BCD码放入R0+n指向的n个字节中,余数压缩BCD码放入R0指向的n个字节
;使用A,R0,R1,R2,R3,R4,R6,R7,影响CY,CY=1结果溢出
;==============================================================================
CDIV:           MOV     A,R3
                ADD     A,R3
                MOV     R7,A
                DEC     R0
                DEC     R1
CDIV1:          MOV     A,R3
                ADD     A,R3
                MOV     R2,A
                ADD     A,R0
                MOV     R0,A
                CLR     A
CDIV2:          XCH     A,@R0
                SWAP    A
                XCHD    A,@R0
                XCH     A,@R0
                DEC     R0
                DJNZ    R2,CDIV2
                MOV     R4,A
CDIV3:          MOV     A,R3
                MOV     R6,A
                ADD     A,R0
                MOV     R0,A
                ADD     A,R3
                XCH     A,R0
                INC     @R0               
                XCH     A,R0
                MOV     A,R1
                ADD     A,R3
                MOV     R1,A
                SETB    C
CDIV4:          CLR     A
                ADDC    A,#99H
                SUBB    A,@R1
                ADD     A,@R0
                DA      A
                MOV     @R0,A
                DEC     R0
                DEC     R1
                DJNZ    R6,CDIV4
                CPL     C
                MOV     A,R4
                SUBB    A,#0
                MOV     R4,A

                JC      CDIV6
;--------------------------------------------------------------------
;FOR OVER
                MOV     A,R0
                PUSH    ACC
                ADD     A,R3
                ADD     A,R3
                MOV     R0,A
                MOV     A,@R0
                CJNE    A,#10,CDIV_NO_OVER
                POP     ACC
                MOV     @R0,#99H
                SETB    C
                RET
CDIV_NO_OVER:   POP     ACC
                MOV     R0,A
                SJMP    CDIV3
;--------------------------------------------------------------------
CDIV6:          MOV     A,R3
                MOV     R6,A
                ADD     A,R0
                MOV     R0,A
                ADD     A,R3
                XCH     A,R0
                DEC     @R0
                XCH     A,R0
                MOV     A,R1
                ADD     A,R3
                MOV     R1,A
                CLR     C
CDIV5:          MOV     A,@R0
                ADDC    A,@R1
                DA      A
                MOV     @R0,A
                DEC     R0
                DEC     R1
                DJNZ    R6,CDIV5
                DJNZ    R7,CDIV1
                CLR     C
                RET
;==============================================================================
原文地址:https://www.cnblogs.com/cloudstep/p/1514686.html