2. [метка: ] мнемоника команды [аргументы команды] [комментарий]
3. Комментарий
4. Пустая строка
Комментарии всегда начинаются с символа «;».
Элементы, заключенные в квадратные скобки, могут отсутствовать. Текст, расположенный после символа «точка с запятой» до конца строки, полностью игнорируется ассемблером. Использование меток, мнемоник команд микроконтроллера и директив ассемблера подробнее будет рассмотрено чуть позднее.
Примеры записи строк:
label1:.EQU var1=100; Директива определения символьного
; имени var1, эквивалентного записи ”100"
.EQU var2=200; Определение имени var2, соответствующего "200"
test: rjmp test; Бесконечный цикл (мнемоника команды микроконтроллера)
; Пустая строка
Обратите внимание, что не играет никакой роли, в каких местах расположены метки, команды ассемблера и директивы, важен только их порядок.
Транслятор ассемблера позволяет использовать в тексте программы мнемоники (обозначения команд микроконтроллера), полностью совпадающие с их названием в системе команд микроконтроллера.
Команды микроконтроллеров семейства AVR делятся на несколько групп:
• арифметические и логические;
• команды условных и безусловных переходов;
• команды передачи данных;
• команды для работы с битами.
Краткое описание команд микроконтроллера можно найти в главе 2.
Для транслятора ассемблера нет разницы, какими буквами написаны слова, т. е. rjmp и RJMP совершенно равнозначны. Однако для удобства понимания программы рекомендуется все мнемоники и метки записывать строчными (маленькими) буквами, а директивы прописными (большими).
Транслятор ассемблера поддерживает достаточно много директив. Директивы не транслируются в программу для микроконтроллера. Они используются для указания транслятору ассемблера данных о расположении программы в памяти микроконтроллера, определения макросов и т. д.
Ниже приведен перечень директив транслятора ассемблера:
.BYTE — резервирует 1 байт для использования в качестве переменной;
.CSEG — сегмент программ;
.DB — определяет байт-константу;
.DEF — определяет символическое имя для регистра;
.DEVICE — задает тип целевого микроконтроллера;
.DSEG — сегмент данных;
.DW — определяет слово-константу;
.ENDMACRO — конец определения макроса;
.EQU — сопоставляет символьному имени арифметическое выражение;
.ESEG — сегмент EEPROM;
.EXIT — выйти из файла (конец текста программы);
.INCLUDE — загрузить исходный текст из другого файла;
.LIST — включить генерацию листинга;
.LISTMAC — включить печать содержимого макросов в листинге;
.MACRO — начать определение макроса;
.NOLIST — выключить генерацию листинга;
.ORG — установить расположение;
.SET — сопоставить символу выражение.
Обратите внимание, что все директивы должны начинаться с точки.
Директива BYTE резервирует один байт в памяти SRAM для реализации переменной. Для того чтобы иметь возможность обращаться к этой переменной, перед директивой BYTE должна стоять метка. Директива имеет один параметр — количество байтов для резервирования. Директива может использоваться только для резервирования места в памяти данных (смотри директивы CSEG, DSEG и ESEG).
Синтаксис:
Метка:.BYTE числовое выражение
Примеры:
.DSEG
var1:.BYTE 1; Резервируем 1 байт для переменной var1
able:.BYTE tab_size; Резервируем tab_size байт
.CSEG
ldi r30,low(var1); Загружаем младший байт Z-регистра
ldi r31,high(var1); Загружаем старший байт Z-регистра
Id r1,Z; Загрузить содержимое переменной var1 в r1
Директива CSEG определяет начало сегмента кода (программ). В исходном тексте программы может быть несколько сегментов кода. Транслятор ассемблера в процессе компиляции программы объединяет все сегменты кода в один. Директива BYTE не может быть использована в сегменте кода. Если в программе нет явного указания названия сегмента, по умолчанию считается, что это сегмент кода. Директива CSEG не имеет никаких параметров. Сегмент кода имеет свой счетчик слов. Директива-ORG может быть использована для размещения кода или констант в определенном программистом месте памяти программ.
Синтаксис:
.CSEG