求十六进制转换成BCD码的方法或原理 或者帮我解读一下这段

2025-02-24 08:17:33
推荐回答(2个)
回答1:

首先解释此段程序功能:

     入口参数: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中)。

     希望能够帮到你。

回答2:

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 码。