Большинство ассемблеров позволяет программисту определять последовательность команд процессора в виде
Delay_1ms macro
local LOOP
movlw d’250’; Считаем от 250
LOOP addlw -1; Декрементируем
btfss STATUS,Z; до нуля
goto LOOP;
endm
При использовании в теле макрокоманды меток они должны быть объявлены в ней с помощью директивы local. Эта директива применяется для разрешения конфликта совпадения имен меток при многократном использовании макрокоманды в теле программы.
Данный пример достаточно необычен, поскольку созданная нами «команда» не имеет операндов. Как и «родные» команды, макрокоманды могут иметь один и более операндов. Чтобы посмотреть, как это делается, напишем макрокоманду Вnе (переход, если не равно нулю)[115]. Таким образом, команда Bne NEXT приведет к передаче управления на указанную метку, если флаг Z равен нулю, в противном случае выполнение программы продолжится со следующей команды. Макрокоманда Вnе определяется следующим образом:
Bne macro destination
btfss STATUS,Z
goto destination
endm
Обратите внимание, что имя макрокоманды не должно совпадать с именем реальной команды даже из другого семейства микроконтроллеров.
Макрокоманды могут быть любой сложности и иметь любое количество операндов, разделяемых запятыми. К примеру, компания Microchip предоставляет большое количество макрокоманд, реализующих различные арифметические операции, такие как умножение 16-битных и 32-битных чисел. Однако интенсивное использование макрокоманд может усложнить отладку программы, особенно в тех случаях, когда простая с виду макрокоманда имеет побочные эффекты в виде изменения содержимого регистров и состояния флагов. Частым источником ошибок является использование перед макрокомандой команд пропуска с целью обойти ее при некотором событии. Поскольку макрокоманда в реальности состоит из нескольких команд, выполнение команды пропуска приведет к переходу внутрь макрокоманды, причем с тяжелыми последствиями.
include "mymacro.mac"
позволит программисту использовать все макроопределения, описанные в этом файле. Любой макрос, определенный во включаемом файле, но не использующийся в программе, никоим образом не влияет на итоговый машинный код.
Описанный выше процесс называется абсолютным ассемблированием. В этом случае
Процесс создания программы, используемый в таких случаях, изображен на Рис. 8.3. Ключевую роль здесь играет программа
Рис. 8.3.
Если рассматривать эту программу как разновидность компоновщика задач, то ее основными функциями будет следующее:
• Объединение кода и данных различных входных модулей.
• Присваивание числовых значений символьным меткам, которым не были заданы фиксированные значения самим программистом, с использованием директив equ и аналогичных.