📄 bcdandhex.asm
字号:
;=====================================
;待转换的三字节BCD码整数在R4R5R6中.
;转换后的双字节十六进制整数仍在R4R5R6中.
;10000==2710H
BCD_HEX_3BYTES:
LCALL BCD_HEX_2BYTES ;将低字节,中字节转换成十六进制
MOV A,R4 ;将高字节转换成十六进制
LCALL BCD_HEX_1BYTE
MOV R4,A
MOV B,#10H ;进位低字节
MUL AB
MOV R7,A ;低位暂存R7
ADD A,R6
MOV R6,A
MOV A,B
ADDC A,#00H
MOV R7,A ;向高位进位
MOV A,R4
MOV B,#27H ;进位高字节
MUL AB
ADD A,R7
ADDC A,R5
MOV R5,A
MOV A,B
ADDC A,#00H
MOV R4,A
RET
;---------------------------------------------
;入口条件:待转换的双字节BCD码整数在R5R6中.
;出口信息:转换后的双字节十六进制整数仍在R5R6中.
;------------------------------------------------
BCD_HEX_2BYTES: MOV A,R6 ;将低字节转换成十六进制
LCALL BCD_HEX_1BYTE
MOV R6,A
MOV A,R5 ;将高字节转换成十六进制
LCALL BCD_HEX_1BYTE
MOV B,#100 ;扩大一百倍
MUL AB
ADD A,R6 ;和低字节按十六进制相加
MOV R6,A
CLR A
ADDC A,B
MOV R5,A
RET
;---------------------------------------
;单字节BCD码转换为十六进制整数
;出口信息:转换后的16进制数A中,百位在R7中.
;---------------------------------------
BCD_HEX_1BYTE: MOV B,#10H ;分离十位和个位
DIV AB ;A里为商;B里为余数
MOV R7,B ;余数暂存为个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,R7 ;按十六进制加上个位
RET
;===============================================
;三字节十六进制整数转换BCD码.
;入口条件:待转换的三字节十六进制整数在R4R5R6中.
;出口信息:转换后的四字节BCD码整数在R1R2R3中,最高字节在B中.
;---------------------------------------------------------------------------------
HEX_BCD_3BYTES:
CLR C ;BCD码初始化为0
MOV A,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV B,#00H
MOV R7,#18H ;转换三字节十六进制整数
HEX_BCD_LOOP3:
MOV A,R6 ;低位字节
RLC A ;从高端移出待转换数的一位到CY中
MOV R6,A
MOV A,R5 ;中间字节
RLC A
MOV R5,A
MOV A,R4 ;高位字节
RLC A
MOV R4,A
MOV A,R3 ;BCD码带进位自身相加,相当于乘2
ADDC A,R3 ;低位字节带进位位相加
DA A ;十进制调整
MOV R3,A
MOV A,R2 ;中间字节
ADDC A,R2
DA A
MOV R2,A
MOV A,R1 ;高位字节
ADDC A,R1
DA A
MOV R1,A
MOV A,B
ADDC A,B
DA A
MOV B,A
DJNZ R7,HEX_BCD_LOOP3 ;处理完24BIT
RET
;------------------------------------------------
;双字节十六进制整数转换BCD码.
;入口条件:待转换的双字节十六进制整数在R6R7中.
;出口信息:转换后的三字节BCD码整数在R3R4R5中.
;--------------------------------------------
HEX_BCD_2BYTES: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HEX_BCD_LOOP2: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HEX_BCD_LOOP2 ;处理完16BIT
RET
;-------------------------------------------
;单字节十六进制整数转换BCD码.
;入口条件:待转换的单字节十六进制整数在累加器A中.
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中.
HEX_BCD_1BYTE: MOV B,#100 ;分离出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余数继续分离十位和个位
XCH A,B
DIV AB
SWAP A
ORL A,B ;将十位和个位拼装成BCD码
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -