【发布时间】:2015-05-16 09:06:19
【问题描述】:
8位二进制转16位BCD的算法是什么?
例如:
我该怎么做?
1111 1111(二进制)-> 0000 0010 0101 0101
【问题讨论】:
标签: assembly binary avr bcd atmega16
8位二进制转16位BCD的算法是什么?
例如:
我该怎么做?
1111 1111(二进制)-> 0000 0010 0101 0101
【问题讨论】:
标签: assembly binary avr bcd atmega16
最快的计算方法是修改“bin2BCD8”例程,如AVR204 中所述。减去 100 直到小于 100,每次递增一个单字节计数器(在偶数寄存器中)。然后对 10 执行相同的操作,将寄存器中的计数器放在百位计数器之后。使用SWAP将十位计数器移到高半字节,加个单位余数,返回16位寄存器值。
【讨论】:
您可以跳转到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
【讨论】:
sbci吗? 128以下的每个数字的高半部分都是0,所以sbci r18, 0没有借位只是浪费指令。 (subi FL, -1 在ones_found: 之后也是如此,就在你覆盖 FL 和 FH 之前。)另外,你不能安排事情(包括初始计数器值),所以你可以 subi CH, -16 before FL,所以你可以使用brmi 的反义词作为循环分支,而不需要单独的rjmp。就像ldi CL, 0xEF 一样,如果我有这个权利:高半字节将获得 2 个额外的增量,一个来自低位的结转。