首先解释此段程序功能:
入口参数:R6,R7,存放16位二进制数,R6为高8位。
出口参数:R3,R4,R5,存放转换后的BCD码,R3为高位。
程序思路:
把16位二进制数按权展开后再进行BCD码相加。如下图:
注意此处加法是按照BCD码相加(代码中有十进制调整指令DA A)。
具体算法:
把16位二进制数的每一位都先移入进位标志C,然后乘以2的n次方,这里n是该位的权值。(此段程序是用与自身相加的方法实现乘2操作的)。
因为共有16位2进制数,所以需要进行16次循环(程序中用R2保存循环次数)。这样最高位(即R6的最高位)最先被移出并在第一次循环中做了乘2操作并保存在R3R4R5中以供下次累加,第二次循环时该值被再次乘2并累加,以后每次循环都相当于再次进行乘2并累加,这样最高位一共进行了16次乘2累加,也就是乘以2的16次方。同理,R6的次高位第二次被移出,所以少循环一次,相当于乘以2的15次方并累加。
举例说明:
设R6=00H、R7=10H,则R7中的“1”在第12次循环时被移入C中,在以后的4次循环中实现了乘以2的4次方并进行BCD码累加,具体过程如下:
R6R7=0000 0000 0001 0000。
R5=R4=R3=0
第1次循环:R6最高位的0被移入C标志位后用ADDC指令与R5进行BCD码相加(如有进位则进到R4和R3中,此处无进位),R5=0
第2次循环:0被移出后与R5进行BCD码相加,R5=0
第3次循环:0被移出后与R5进行BCD码相加,R5=0
... ...
第11次循环:0被移出后与R5进行BCD码相加,R5=0
第12次循环:1被移出后与R5进行BCD码相加,R5=1
第13次循环:0被移出后与R5进行BCD码相加,R5=2
第14次循环:0被移出后与R5进行BCD码相加,R5=4
第15次循环:0被移出后与R5进行BCD码相加,R5=8
第16次循环:R7最低位的0被移出后与R5进行BCD码相加,R5=16
所以最终结果就是16(放在R5中)。
希望能够帮到你。
R6,R7,存放 16 位二进制数,R6 为高 8 位。
MOV A, R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7, A
MOV A, R6
RLC A
MOV R6, A
----以上六行,将 16 位数的最高位,移入 CY。
=========================
R3,R4,R5,存放六位压缩的 BCD 码。
(实用五位:万千百十个。)
MOV A, R5
ADDC A, R5
DA A ;调整为压缩 BCD 吗
MOV R5, A
----以上四行,将 R5 左移一位,并将 CY 加入空位。
----并且,将“和”调整为“压缩 BCD 码”。
……----左移 R4,并调整成为压缩 BCD 码。
……----左移 R3,并调整成为压缩 BCD 码。
----经过以上各条,就完成了一个循环。
=========================
在一个循环中:
就把 16 位二进制数的最高位,
移入了压缩 BCD 码的最低位。
循环 16 遍,就完成了:十六位数,转换到 BCD 码。