Десяткові числа машинною мовою можуть бути представлені у вигляді восьмирозрядних послідовностей одиниць і нулів, тобто байтів. У цьому є два види форматів представлення десяткових чисел. Це упакований формат ( 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)