Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

200 Часть 11. Программирование микроконтроллеров АVR на ассемблере . macro Add32 2 4 add @ 3 , @ 6 ;младшие разряды adc @ 2 , @ 5 ; байтl + С adc @ 1 , @ 4 ; байт2 + С adc @ 0 , 0 ; С -> старший разряд . endmacro Соответственно, вызов такого макроса может, например, выглядеть, так: Add32_2 4 r1 6 , r17 , r1 8 , r l 9 , rl , r2 , r3 где в регист Р ах r l б , rl 7 , rl B , r1 9 по-прежнему находятся байты первого слагаемого (старший в rl б, младший в r 1 9 ) , в rl , r2 , rЗ - байты второго (старший в rl, млад­ ший в rз ) , а результат будет записан, как и ранее, в r l б , rl 7 , rl B , r1 9 . У множение многоразрядных чисел Несколько сложнее с умножением и, особенно, делением. Ассемблерный текст универсальных (т. е. пригодных для всех моделей контроллеров) процедур умно­ жения можно найти в Appl ication note АVR200 (на новом сайте Microchip эта «апп­ нота» переименована в AN_093 6), представленной в виде АSМ-файла («аппноту» AVR200 в аsm-виде можно найти в архиве по адресу, который указан во введении. Учтите, что в архивном варианте некоторые алгоритмы подправлены в сравнении с оригинальным текстом). ЗАМЕТКИ НА ПОЛЯХ На старом сайте atmel .com найти что-то в ворохе различных Appl ication notes было сложно , но там они, по крайней мере, лежали по порядку номеров. В Microch ip, мало того, что сочли нужным переименовать «аппноты» (сохранив , правда, старое название в подзаголовке) , но и разместили их внавал без особой системы, так что нельзя даже отфильтровать «аппноты» , относящиеся к AVR8 , от остальных разновидностей МК. Если вы доберетесь до полного списка «аппнот» (что получается не с первого раза: Главная страница microch ip.com --+ Products --+ Resources --+ Арр Notes) , то единствен­ ная возможность там что-то найти - набрать в строке поиска или известный номер (AVR200) , или характерное ключевое слово {multiply в данном случае) . Для больших величин мы будем пользоваться своими процедурами. На практике, как мы говорили ранее, 32-разрядное число (максимально 4 294 967 296, т. е. более девяти десятичных разрядов) с точки зрения точности в большинстве случаев из­ быточно. Если мы ограничимся 24 разрядами результата, то нам придется пожерт­ вовать частью диапазона исходных чисел так, чтобы сумма двоичных разрядов со­ множителей не превышала 24. Например, можно перемножать два 1 2-разрядных числа (в пределах 0-4095 каждое) или 1 0-разрядное (скажем, результат измерения АЦП) на 1 4-разрядный коэффициент (до 1 6 3 83) . Так как при умножении точность не теряется, то этого оказывается более чем достаточно, чтобы обработать боль­ шинство практических величин.

RkJQdWJsaXNoZXIy MTExODQxMg==