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
;==============================================================================
;多字节二进制整数转换为十进制整数子程序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
;==============================================================================