【问题标题】:What is algorithm of converting 8 bit binary to 16 bit bcd?将 8 位二进制转换为 16 位 bcd 的算法是什么?
【发布时间】:2015-05-16 09:06:19
【问题描述】:

8位二进制转16位BCD的算法是什么?

例如:

我该怎么做?

1111 1111(二进制)-> 0000 0010 0101 0101

【问题讨论】:

    标签: assembly binary avr bcd atmega16


    【解决方案1】:

    最快的计算方法是修改“bin2BCD8”例程,如AVR204 中所述。减去 100 直到小于 100,每次递增一个单字节计数器(在偶数寄存器中)。然后对 10 执行相同的操作,将寄存器中的计数器放在百位计数器之后。使用SWAP将十位计数器移到高半字节,加个单位余数,返回16位寄存器值。

    【讨论】:

    • 这不是最快的,要小心说明这样的事情;)查找表可能更快,但会消耗内存。
    • @Jester:很公平。已修改。
    • 甚至不是这样。 atmega16 有一个硬件乘法器,所以我打赌你可以做得比循环(平均)更好。好吧,也许不是,但这是一个近距离的电话。必须比较实际的实现:)
    【解决方案2】:

    您可以跳转到find_hundreds(清除CL和CH后)转换存储在FL(AVR 8位指令集)中的单个8位值。

    .DEF FL = r17
    .DEF FH = r18
    .DEF CL = r19
    .DEF CH = r20
    
    ; input:
    ;     FH:FL registers holding hex value
    ; output:
    ;     FH:FL registers holding converted BCD value
    hex_to_bcd:
        ldi CL, 0
        ldi CH, 0
    find_thousands:
        subi FL, low(1000)
        sbci FH, high(1000)
        brmi thousands_found ; branch if minus
        subi CH, -16
        rjmp find_thousands;
    thousands_found:
        subi FL, low(-1000)
        sbci FH, high(-1000)
    find_hundreds:
        subi FL, low(100)
        sbci FH, high(100)
        brmi hundreds_found 
        subi CH, -1
        rjmp find_hundreds;
    hundreds_found:
        subi FL, low(-100)
        sbci FH, high(-100)
    find_tens:
        subi FL, low(10)
        sbci FH, high(10)
        brmi tens_found      
        subi CL, -16
        rjmp find_tens;
    tens_found:
        subi FL, low(-10)
        sbci FH, high(-10)
    find_ones:
        subi FL, low(1)
        sbci FH, high(1)
        brmi ones_found 
        subi CL, -1
        rjmp find_ones;
    ones_found:
        subi FL, low(-1)
        sbci FH, high(-1)
        mov FL, CL
        mov FH, CH
    

    【讨论】:

    • 一旦你把数字减少到100以下,你不能跳过高半部分sbci吗? 128以下的每个数字的高半部分都是0,所以sbci r18, 0没有借位只是浪费指令。 (subi FL, -1ones_found: 之后也是如此,就在你覆盖 FL 和 FH 之前。)另外,你不能安排事情(包括初始计数器值),所以你可以 subi CH, -16 before FL,所以你可以使用brmi 的反义词作为循环分支,而不需要单独的rjmp。就像ldi CL, 0xEF 一样,如果我有这个权利:高半字节将获得 2 个额外的增量,一个来自低位的结转。
    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2017-09-27
    • 2013-06-11
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多