支持楼主,我把原程序也简单的注释一下
BIN2BCD:
MOV A, R3
ANL A, #0FCH ;取高字节的高6位
RR A
RR A ;除以4
MOV R5,A ;有多少个1024,放入R5,
ADD A, R5
ADD A, R5 ;乘以3
MOV R7,A ;1024的个数乘以3,放入R7
MOV A, R2
ANL A, #3 ;取低字节的低2位,高6位为0
MOV R6,A ;低字节的低两位放入R6
XRL A, R3 ;高字节与低字节低2位想异或,高6位为高字节的
ANL A, #3 ;高字节与低字节低2位想异或,高6位为0
XRL A, R2 ;低2位为高字节的低2位,高6位为低字节的高6位
RR A ;
RR A ;两字节中从高字节低2位到低字节高6位的组成的一个字节
ADD A, R7 ;下面的步骤求出有多少个4,由于1024比1000多出24,1024的个数乘以6
JNC L2 ;也就可以求出这么多个1024中含有的4的个数,它可能大于256,所以分两次加
INC R5 ;逢256个4,超过1000,1000个数加1
ADD A, #6 ;由于250X4=1000,多出了6个,4的个数要加上6
L2: ADD A, R7 ;A中存放的是4的个数,
MOV B, #25
JNC L3
INC R5 ;
ADD A, #6 ;与上次加法运算的原理相同
DIV AB
SJMP L4
L3: DIV AB ;至此A中存放的是4的个数,除以25,也就可以得出100的个数
CJNE A, #10, L4
INC R5 ;如果超过25X10个4,R5需加1;至此R5中存放的是1000的个数
CLR A ;剩余的个数不超过25
L4: MOV R7,A ;100的个数入R7
MOV A, #10
XCH A, B ;余数入A,前面求出1000和100的个数,剩余的4的个数用于求十位和个位。
ADD A, #(L5-$-3)
MOVC A, @A+PC ;依据余数取数
ADD A, R6 ;加上低两位
DA A ;十进制调整
XCH A, R5 ;十位个位放入R5,A中的是1000的个数
DIV AB ;除以10,商也就是10000的个数,余数为1000的个数
XCH A, R7 ;10000的个数放入R7,A中为100的个数
SWAP A ;100个数放高半字节
ORL A, B ;1000的个数低半字节
SWAP A ;交换
MOV R6,A ;放入R6
RET
L5: DB 00H, 04H, 08H, 12H, 16H
DB 20H, 24H, 28H, 32H, 36H
DB 40H, 44H, 48H, 52H, 56H
DB 60H, 64H, 68H, 72H, 76H
DB 80H, 84H, 88H, 92H, 96H
END