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

140 Часть 11. Программирование микроконтроллеров АVR на ассемблере АVR-ассемблера образовали suЬi от suЬ и т. д. Фактически мы дополнили список команд еще одной, причем не задействовав ни одного лишнего регистра - r l б, ко­ торый rут используется временно, благодаря помещению в стек после операции остается в неприкосновенности. Параметры, необходимые для выполнения макро­ са, нумеруются просто по порядку, начиная с нуля, причем, как видите, никакого указания типа не требуется : вместо @ О компилятор подставит то, что будет стоять на первом месте при вызове, вместо @ 1 - на втором, и т. д. Выполнение макроса займет ровно 4 такта (вместо одного в случае чистой eor ) , но ни единого лишнего сверх того. Так в чем же rут собака порылась - почему нельзя всегда вместо подпрограмм, вызов которых занимает лишние такты, требует инициализации стека (даже если в самой процедуре стек не используется) и тем самым свободного пространства в SRAM, применять макросы, которые никаких ресурсов не требуют? Очень про­ сто: макрос, строго говоря, не является средством программ ирования - это лишь удобный способ сокращения записи, не более того. Компилятор во всех местах, где встретит имя макроса, тупо подставит соответствующую последовательность ко­ манд, и при обратном дизассемблировании вы никаких следов макросов уже не об­ наружите . И кстати, указание компилятора на ошибку при вызове макроса также отправит совсем не на ту строку, где она допущена. И если вынос повторяющихся участков кода в подпрограммы реально снижает объем кода и экономит память, то макросы ничего такого не делают. Вместо процедур макросы можно применять просто для удобства тогда, когда вынести за скобки нужно две-три назойливо по­ вторяющиеся строчки кода, выполнение которых будет длиться меньше, чем вызов подпрограммы. Но надо при этом учитывать, что читаемость программы тоже ухудшится, и ошибки будет искать труднее. НЕХ-файлы и их загрузка в контроллер Большинство команд в АVR имеют размер в два байта, из которых собственно код команды может занимать первые 4-7 битов, остальное занимают параметры, если они предусмотрены форматом команды. Все это вместе носит название командное слово, или код операции (КОП, опкод), и у АVR его формат выгодно отличается относительным единообразием: выбиваются из двухбайтового формата только jmp, call и немногие другие, у которых сами параметры могут занимать по два байта и более. Компилятор записывает каждый код операции в выходной файл с расширением .hex, который затем используется программатором для записи в контроллер. Кроме hех-файлов, есть и другие форматы записи готовых программ (самый распро­ страненный- бинарный, который используется, например, во всех известных windows/dos-фopмaтax ЕХЕ и СОМ), но hех-формат для микроконтроллеров самый распространенный, и мы будем рассматривать только его. Рассматриваемый формат придуман фирмой Intel (есть и другие «гексьт ! ) и отли­ чается тем, что содержит числа в текстовом представлении, причем в шестнадцате-

RkJQdWJsaXNoZXIy MTExODQxMg==