Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
212 Часть 11. Программирование микроконтроллеров АVR на ассемблере rnov dataO , data andi dataO , ObO O O O l l l l ; выделяем младший rnov datal , data andi datal , OЫl l l O O O O ; выделяем старший swap datal ; меняем тетрады местами ; Экономичный вариант с замещением исходного упакованного BCD ; BCD - в data O , выход - datal : dataO rnov data l , dataO andi datal , OЫl l lO O O O ; выделяем старший swap datal ; меняем тетрады местами andi dataO , ObO O O O l l l l ; выделяем младший Каноническая процедура преобразования произвольного числа в BCD - последо вательное нахождение остатков от деления на 1 О. Для ряда практических случаев она может быть существенно упрощена. Так, процедура Ьin2всов для преобразова ния однобайтового числа в BCD, приведенная далее, работает только для чисел от О до 99 = $ 63 . В «аппноте» процедура представлена в универсальном виде, пригодном (при небольшой модификации) и для получения упакованного BCD, и для сразу распакованного (результат в двух отдельных байтах). Здесь приведен ее вариант, более экономно задействующий регистры (лис тинг 8 . 1 2) . Исходное НЕХ-число содержится в регистре ternp, распакованный результат - в ternpl : ternp. Как и в предыдущих случаях, комментарии сохранены из исходного текста. Процедура выполняется за время от 5 до 50 тактов, в зависимо сти от исходного числа. ; преобразование В-разрядного hex в неупакованный и упакованный BCD ; вход hex = ternp , выход BCD ternpl - старший , ternp - младший ; эта процедура работает только для чисел от О до 9 9 Ьin2bcd8 : clr ternpl ; clear result MSD bBCDB 1 : suЬi ternp , 1 0 ; input = input - 1 0 brcs bBCDB 2 ; abort i f carry set inc ternpl ; inc MSD rjrnp bBCDB 1 ; loop again bBCDB 2 : suЬi ternp , -1 0 ; cornpensate extra suЬtraction / * ----- ; для получения упакованного (в ternp) раскомментировать : swap ternpl ; меняем тетрады местами в старшем or ternp , ternpl ; складываем ----- * / ret
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==