-3

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

例如:

我怎样才能做到这一点?

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

4

2 回答 2

2

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

于 2015-03-13T18:56:34.440 回答
0

您可以跳转到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
于 2021-04-23T13:06:12.803 回答