Десятичные числа на машинном языке могут быть представлены в виде восьмиразрядных последовательностей единиц и нулей, то есть байтов. При этом существует два вида форматов представления десятичных чисел. Это упакованный формат ( BCD ) и распакованный.
Распакованный формат
В данном формате один разряд десятичного числа помещается в один байт. А именно в младшую тетраду байта, тогда как старшая тетрада (именуемая зоной) заполняется единицами. К примеру число 157 будет выглядеть следующим образом.
Упакованный формат - BCD
В упакованном формате байт содержит два разряда десятичного числа и также может содержать код знака. Как в ниже следующем примере, в котором представлено число "-1574".
Преобразование числа в BCD в шестнадцатеричный вид и обратно
При работе с микроконтроллерами Atmega может понадобиться преобразование числа в шестнадцатеричном виде в формат упакованного десятичного числа, то есть в BCD формат:
;======= Преобразование из BCD в HEX =================================================== BCD_to_HEX: push r16 ; Помещаем преобразуемую величину в стек andi r16,0b11110000 ; Маскируем регистр r16, как старший разряд swap r16 ; Меняем тетрады местами ldi r17,10 ; Записываем во вспомогательный регистр значение 10 mul r16,r17 ; Умножаем значение регистра r16 на 10, результат сохраняется ; в регистры r1, r0 pop r16 ; Изымаем сохраненную величину из стека andi r16,0b00001111 ; Маскируем регистр r16, как младший разряд add r16,r0 ; Производим сложение регистра r16 с регистром r0, ; в результате получаем двоичное число от 0 до 99 ret
А также обратное преобразование:
;======= Преобразование из HEX в BCD ==================================================== HEX_to_BCD: clr r17 ; Очищаем регистр help HEX_to_BCD_l: subi r16,10 ; temp = temp — 10 brcs HEX_to_BCD_2 ; Прервать, если перенос установлен inc r17 ; Инкрементируем r17 rjmp HEX_to_BCD_l ; Проходим по циклу проверки заново HEX_to_BCD_2: subi r16,-10 ; компенсируем отрицательное значение в r16 swap r17 ; Меняем тетрады местами or r16,r17 ; Объединяем полученные значения в Упакованный BCD ret
Как Вы уже заметили, работа производится в этих программах с четырьмя регистрами: r0, r1, r16, r17. Целевым регистром в данном случае выступает регистр r16. Также эти программки работают с числами от 0 до 99.
Внимание. Также для работы библиотеки требуется инициализировать Стек микроконтроллера. Например следующим образом:
;======= Макросы ======================================================================== ; Макрос вывода в порт или регистр .macro outi ldi r16, @1 out @0,R16 .endm ;======================================================================================== RESET: outi SPL,Low(RAMEND) ; Инициализация стека outi SPH,High(RAMEND)