Каков алгоритм преобразования 8-битного двоичного файла в 16-битный BCD?

Что такое алгоритм преобразования 8-битного двоичного кода в 16-битный BCD?

например:

Как я могу это сделать?

1111 1111 (двоичный) -> 0000 0010 0101 0101

2 ответа

Самый быстрый вычислительный метод был бы модификацией подпрограммы "bin2BCD8", как описано в AVR204. Вычитайте 100, пока число не станет меньше 100, увеличивая счетчик байтов (в четном регистре) каждый раз. Затем сделайте то же самое для 10 со счетчиком в регистре после счетчика сотен. использование SWAP чтобы переместить счетчик десятков в верхний клочок, добавьте остаток единиц и верните 16-битное значение регистра.

Вы можете перейти к find_hundreds (после очистки CL и CH) для преобразования одного 8-битного значения, хранящегося в FL (8-битный набор команд AVR).

      .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
Другие вопросы по тегам