Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
180 Часть 11. Программирование микроконтроллеров АVR на ассемблере в регистрах r25 : r24 окажется число з о о (в r2 5 будет записано $ 0 1 , что эквивалент но 256 для 1 6-разрядного числа, а в r2 4 - $2С = 44, что в сумме и даст 300). Анало гично работает и процедура вычитания константы sЬiw . Контроллеры семейства Mega снабжены операцией умножения, реализованной не сколько неочевидным образом. Так как при умножении результат гораздо чаще оказывается двухбайтовым, чем при сложении, то он помещается в специально для этого выделенные первые два регистра общего назначения rl : ro : mul Xdat , Ydat ; Xdat - множимое , Ydat - множитель , ; двухбайтовый результат в rl : rO Подробнее об умножении и делении многоразрядных чисел мы, как уже обещали, поговорим в главе 8. К оманды пересылки дан ных Здесь мы рассмотрим команды, которые переносят данные из одной области памя ти в другую (память рассматривается тут в широком смысле этого слова, и в нее включаются также и регистры). Некоторые команды из этой группы нам уже зна комы - это ldi и mov. Первая загружает в регистр непосредственно число константу (но действует только для регистров, начиная с r l б ) , а вторая - значение другого регистра. Часто забывают, что, кроме простой mov, есть еще movw, которая за один такт позволяет выполнить пересылку сразу двухбайтового слова. При этом в ней указываются только младшие байты, которые должны находиться в регистре с четным номером (в следующем по порядку нечетном будет находиться старший байт) : movw rl б , rO ; скопирует пару rl : rO в rl7 : rl 6 Повторим, что ldi очень часто записывают с использованием выражений, что мож но пояснить следующим практическим примером: ldi temp , ( l<<RXEN l l<<TXEN ) Напомним, что при указании функции Побитовое ИЛИ скобки ставить необяза тельно (ее приоритет выше, чем у операции сдвига) . Смысл приведенного выраже ния в том, что мы устанавливаем в единицы в регистре temp только биты с указан ными именами (естественно, последние должны быть где-то определены - будем считать, что это сделано в INС-файлах). В рассмотренном примере мы хотим ини циализировать последовательный порт UART, и приведенная форма записи означа ет, что устанавливается разрешение приема ( RXEN ) и передачи ( TXEN ) . Обратите внимание, что, в отличие от команды sЬi, неуказанные биты будут в этой операции обнулены, а не останутся при своих значениях. Такая форма очень удобна для задания поименованных битов в процессе инициализации служебных регист ров. Вместо имен могут быть указаны непосредственно номера битов, но записы вать их в такой форме нецелесообразно, - здесь как раз удобнее указывать имена.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==