-
TEST_NUM EQU 12345
ORG 000H
MOV R2, #LOW(TEST_NUM) ; #11111111B
MOV R3, #HIGH(TEST_NUM); #11111111B ; 65535
CALL BIN2BCD
SJMP $
;==================================
BIN2BCD:
;--------------------------------------*
;Input: R3:R2 --- 16 bits bin |
; R2--Bit 0 to bit 7 |
; R3--Bit 8 to bit 15 |
;Output: R7:R6:R5 --- 5 Dig Packed BCD |
; R5: 个位/十位 |
; R6: 百位/千位 |
; R7: 万位 |
;Usage: PSW (C, AC, OV), Acc, B |
; |
;PS: 61 CYs only. 73 bytes |
; DengMiao 2007-4 Guangzhou |
;--------------------------------------*
MOV A, R2
ANL A, #00000011B
MOV R6, A ; R6 --- *1 (bit 0 to bit 1) (2 bits)
MOV A, R3
RRC A
MOV B, A
MOV A, R2
RRC A
MOV C, B.0
RRC A
MOV R7, A ; R7 --- *4 (bit 2 to bit 10) (8 bits)
MOV A, #25 ; 25 * 4 = 100
XCH A, B
RR A
ANL A, #00111111B
MOV R5, A ; R5 --- *1024 (bit 11 to bit 15) (6 bits)
RL A
ADD A, R5
XCH A, R7 ; R7 == 3 * R5 (
-
优化 一般
MOV A, R3 MOV A, R3
RRC A CLR C
RRC A
MOV B, A MOV B, A
MOV A, R2 MOV A, R2
XCH A, B
RRC A RRC A
MOV C, B.0 XCH A, B
CLR C
RRC A RRC A
XCH A, B XCH A, B
RR A RRC A
ANL A, #00111111B XCH A, B
MOV R5, A MOV R5, A
RL A RL A
ADD A, R5 ADD A, R5
XCH A, B XCH A, B
;--------------------------------------
-
把16bits, 分为3段: X -- Bit 10 到 Bit 15, 共 6 bits; (0 - 63) *1024 Y -- Bit 2 到 Bit 9, 共 8 bits; (0 - 255) *4 Z -- Bit 0 到 Bit 1, 共 2 bits; (0 - 3) *1可得到: 1024 * X + 4 * Y + Z = 1000 * X + 24 * X + 4 * Y + Z = 1000 * X + 4 * ( 6 * X + Y ) + Z = 1000 * X + 4 * [ Y + (3*X) + (3*X)] + Z 其中 X 的范围为 0 -- 63, 那么(3*X)的范围就为 0 -- 189, <255 (1 byte)Y+(3*X) 如进位就 X 加1, [Y+(3*X)]-256 加 6, (因为 24 = 4 * 6).另外, {[Y + (3*x)] - 256}+6 < 255 . = 1000 * (X+i) + 4 * {[Y + (3*x) + (3*x)] + 6 * i } + Z = 1000 * (X+i) + 100 * {[Y+3*X+3*X+6*i] \ 25 } + 4 * {[Y+3*X+3*X+6*i] MOD 25 } + Z其中 i 范围为 0 -- 2 {[Y+3*X+3*X+6*i] \ 25 } <= 10 4 * {[Y+3*X+3*X+6*i] MOD 25 } + Z <= 99