Самый очевидный способ десятично-двоичного преобразования вытекает непосредственно из формы записи десятичного числа:
Необходимо просто найти сумму , по заданным коэффициентам di. Ниже приведена подпрограмма, преобразования десятичного 4-разрядного числа из диапазона 0…9999 в его двоичный 2-байтовый эквивалент 0…0x270F. Преобразуемое число хранится в SRAM микроконтроллера в виде четырех двоично-кодированных десятичных цифр d4…d0.
; R17:R16 <- [YH:YL] ; R17:R16 – двоичное число после преобразования ; [YH:YL] – десятичное преобразуемое шестизначное число, ; лежащее в диапазоне 0…9999 (косвенно адресуется через YH:YL) ; R18,R19 - вспомогательные регистры ; decnum – адрес десятичного числа в ОЗУ dec4_bin16: ldi YL,low(decnum) ;заносим в указатель Y адрес ldi YH,high(decnum);начала массива чисел d0…d4 clr R17 ;очищаем регистры R17 ld R16,Y ;заносим к R17:R16 число единицы d0 ldd R18,Y+1 ;добавляем к R17:R16 число десятков d1, ldi R19,10 ;умноженное на 10 (d1*10) mul R18,R19 add R16,R0 ldd R18,Y+2 ;добавляем к R17:R16 число сотен d2, ldi R19,100 ;умноженное на 100 (d2*100) mul R18,R19 add R16,R0 adc R17,R1 ldd R18,Y+3 ;добавляем к R17:R16 число тысяч d3, ldi R19,250 ;умноженное на 4*250 (d3*1000) fmul R18,R19 lsl R0 rol R1 add R16,R0 adc R17,R1 ret
Десятично-двоичное преобразование можно также произвести по схеме Горнера:
D = (…(dn-1*10 + dn-2)*10 + … + d1)*10 + d0 (2)
Такая запись десятичного числа позволяет использовать следующий алгоритм: старший разряд десятичного числа dn-1 умножается на 10 (основание системы), к нему прибавляется следующий разряд dn-2 и полученная сумма dn-1*10 + dn-2 снова умножается на 10 и т.д. Подпрограмма преобразования по схеме Горнера десятичного числа, лежащего в диапазоне 0…65535, в 2-байтовое 0…0xFFFF:
; R17:R16 <- [YH:YL] ; R17:R16 – двоичное число после преобразования ; [YH:YL] – десятичное преобразуемое число, лежащее ; в диапазоне 0…65535 (косвенно адресуется через YH:YL) ; R18,R19,R20,R21 – вспомогательные регистры ; decnum – адрес десятичного числа в ОЗУ dec5_bin16: ldi YL,low(decnum + 5) ;заносим в указатель Y адрес ldi YH,high(decnum + 5) ;конца массива чисел d0…d5 clr R21 ;очищаем вспомогательный регистр R21 ldi R18,10 ;в дальнейшем R18 будет множителем ldi R20,4 ;инициализируем счётчик циклов ld R16,-Y ;заносим старший разряд dn-1 db1: mul R17,R18 ;производим очередное действие mov R17,R0 ;умножения dn-1*10 mul R16,R18 mov R16,R0 add R17,R1 ld R19,-Y ;берём очередной разряд dn-2 add R16,R19 ;и добавляем к произведению dn-1*10 adc R17,R21 dec R20 brne db1 ;повторяем цикл n-1 раз ret
С точки зрения требуемых вычислительных ресурсов десятично-двоичные преобразования, проведенные по формулам (1) и (2), примерно равноценны. Оба алгоритма требуют по n-1 операций сложения и умножения. Однако за счёт того, что в схеме Горнера используется умножение на постоянный множитель 10, вместо серии умножений на 10, 100, 1000… , ее использование оказывается более предпочтительным для преобразования многоразрядных чисел (легче организовать умножение в цикле и меньше команд уходит на подготовку множителя).
Перейти к следующей части: Преобразование из двоичной системы в десятичную
Комментарии (0) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация