Машиналық тілдегі ондық сандар бірліктер мен нөлдердің сегіз разрядты тізбегі, яғни байт ретінде ұсынылуы мүмкін. Ондық сандарды көрсетуге арналған пішімдердің екі түрі бар. Бұл оралған пішім ( 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)