Синтаксис:
.INCLUDE "имя_файла"
Пример: |
|
; файл iodefs.asm: |
|
.EQU sreg = 0x3f |
; Регистр статуса. |
.EQU sphigh = 0x3e ; Старший байт указателя стека. |
|
.EQU splow = 0x3d |
; Младший байт указателя стека. |
; файл incdemo.asm |
|
.INCLUDE iodefs.asm |
; Вложить файл. |
in r0,sreg ; Прочитать регистр статуса. |
|
.LIST включить генерацию листинга
Директива LIST указывает компилятору на необходимость создания листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако данная директива используется совместно с директивой NOLIST для получения листингов отдельных частей исходных файлов.
Синтаксис: |
|
|
.LIST |
|
|
Пример: |
|
|
.NOLIST |
; Отключить генерацию листинга. |
|
.INCLUDE "macro.inc" |
; Вложенные файлы не будут |
|
.INCLUDE "const.def" |
; отображены в листинге |
|
.LIST |
; Включить генерацию листинга. |
|
.LISTMAC включить разворачивание макросов в листинге
После директивы LISTMAC компилятор будет показывать в листинге содержимое макроса. По умолчанию в листинге показываются только вызов макроса и передаваемые параметры.
Синтаксис: |
|
.LISTMAC |
|
Пример: |
|
.MACRO MACX |
; Определение макроса. |
add r0,@0 |
; Тело макроса. |
eor r1,@1 |
|
.ENDMACRO |
; Конец макроопределения. |
.LISTMAC |
; Включить разворачивание макросов. |
MACX r2,r1 ; Вызов макроса (в листинге будет показано тело макроса).
.MACRO начало макроса
С директивы MACRO начинается определение макроса. Макрос (макроопределение) – это микропрограмма, состоящая из
25
последовательности операторов, которые несколько раз встречаются в тексте программы. Эта последовательность операторов включается в тело макроса. Кроме этого, макрос имеет заголовок, состоящий из имени и списка параметров, и окончание. После того как макрос определен, повторяющиеся участки кода в тексте программы заменяются на его имя. Это сокращает текст программы. При встрече имени макроса позднее в тексте программы компилятор заменит его имя на операторы из тела макроса. Таким образом, исполнение макроса заключается в его «расширении».
Макрос в AVRASM может иметь до 10 параметров, к которым в его теле обращаются через @0 – @9. Макрос в AVRASM2 может иметь неограниченное число параметров.
При вызове параметры перечисляются через запятые. Определение макроса заканчивается директивой ENDMACRO.
По умолчанию в листинг включается только вызов макроса, для разворачивания макроса необходимо использовать директиву LISTMAC. Макрос в листинге показывается знаком +.
Синтаксис:
.MACRO имя_макроса
Пример: |
|
.MACRO SUBI16 |
; Начало макроопределения. |
subi @1,low(@0) |
; Вычесть младший байт параметра 0 из параметра 1. |
sbci @2,high(@0) |
; Вычесть старший байт параметра 0 из параметра 2. |
.ENDMACRO |
; Конец макроопределения. |
.CSEG |
; Начало программного сегмента. |
SUBI16 0x1234,r16,r17 ; Вычесть 0x1234 из r17:r16.
.NOLIST выключить генерацию листинга
Директива NOLIST указывает компилятору на необходимость прекращения генерации листинга. Листинг представляет собой комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако может быть отключена данной директивой. Кроме того, данная директива может быть использована совместно с директивой LIST для получения листингов отдельных частей исходных файлов.
Синтаксис: |
|
|
.NOLIST |
|
|
Пример: |
|
|
.NOLIST |
; Отключить генерацию листинга. |
|
.INCLUDE "macro.inc" |
; Вложенные файлы не будут. |
|
.INCLUDE "const.def" |
; отображены в листинге. |
|
.LIST |
; Включить генерацию листинга. |
|
26
.ORG установить положение в сегменте
Директива ORG устанавливает счётчик положения равным заданной величине, которая передаётся как параметр. Для сегмента данных она устанавливает счётчик положения в SRAM (ОЗУ), для сегмента программ это программный счётчик, а для сегмента EEPROM это положение в EEPROM. Если директиве предшествует метка (в той же строке), то метка размещается по адресу, указанному в параметре директивы. Перед началом компиляции программный счётчик и счётчик EEPROM равны нулю, а счётчик ОЗУ равен 32 (поскольку адреса 0 – 31 заняты регистрами). Обратите внимание, что для ОЗУ и EEPROM используются побайтные счётчики, а для программного сегмента – пословный.
Синтаксис:
.ORG выражение
Пример: |
|
.DSEG |
; Начало сегмента данных. |
.ORG 0x37 |
; Установить адрес SRAM равным 0x37. |
variable: .BYTE 1 ; Зарезервировать байт по адресу 0x37H. |
|
.CSEG |
|
.ORG 0x10 |
; Установить программный счётчик равным 0x10. |
mov r0,r1 |
; Данная команда будет размещена по адресу 0x10. |
.SET присвоить переменный значение выражения
Директива SET присваивает имени некоторое значение. Это имя позднее может быть использовано в выражениях. Причем в отличие от директивы EQU значение имени может быть изменено другой директивой
SET.
Синтаксис:
.SET имя = выражение
Примеры: 1)
.SET io_offset = 0x23
.SET porta = io_offset + 2
.CSEG |
; Начало кодового сегмента. |
|
clr r2 |
; Очистить регистр 2. |
|
out porta,r2 |
; Записать в порт A. |
|
2) |
|
|
.SET FOO = 0x114 |
; set FOO to point to an SRAM location, |
|
lds r0, FOO |
|
; load location into r0, |
.SET FOO = FOO + 1 ; increment (redefine) FOO. |
||
|
|
; This would be illegal if using .EQU. |
lds r1, FOO |
|
; Load next location into r1. |
27
3.2.Директивы AVRASM2
ВАссемблере до версии 2.1.9 директивы AVRASM2 начинаются с #:
#define |
#if |
#pragma |
#elif |
#ifdef |
#undef |
#else |
#ifndef |
#warning |
#endif |
#include |
# (пустая директива) |
#error |
#message |
|
В Ассемблере версии 2.1.9 директивы начинаются с точки, также как и директивы AVRASM (табл. 8).
Таблица 8
Директивы AVRASM2 версии 2.1.9 |
||
Директива |
Описание |
|
|
|
|
.DD |
Определение двойного слова |
|
|
|
|
.DQ |
Определение четверного слова |
|
|
|
|
.IF, .IFDEF, .IFNDEF |
Условное ассемблирование |
|
|
|
|
.ELSE, .ELIF |
Условное ассемблирование |
|
|
|
|
.ENDIF |
Условное ассемблирование |
|
|
|
|
.ERROR |
Вывод сообщения об ошибке |
|
|
|
|
.MESSAGE |
Вывод строки сообщения |
|
|
|
|
.OVERLAP/NOOVERLAP |
Установка перекрытия секции |
|
|
|
|
.UNDEF |
Отмена определения символьного имени регистра |
|
|
|
|
.WARNING |
Вывод строки сообщения |
|
|
|
|
.DD – определяет двойное слово(а) в памяти программ и EEPROM.
.DQ – определяет четверное слово(а) в памяти программ и
EEPROM.
Эти директивы подобно директиве .DW определяют нужное количество слов 32-битных (двойные слова) и 64-битных (четверные слова) соответственно.
Синтаксис:
МЕТКА: .DD список выражений МЕТКА: .DQ список выражений
Пример:
.CSEG
varlist: .DD 0, 0xfadebabe, -2147483648, 1 << 30
.ESEG
eevarlst: .DQ 0,0xfadebabedeadbeef, 1 << 62
28
#define – определить макрос препроцессора
Синтаксис:
1)#define имя [value]
2)#define имя(arg.,...) [value]
Описание:
Определяет макрос препроцессора. Есть две формы макроса: (1) –
объект, который в основном определяет константу, и (2) – функция, в которую делают подстановку параметра.
Value – величина (значение) может быть любой строкой, она не определена, пока макрос не будет распакован (расширен). Если величина не определена, она = 1.
Форма (1) макроса может быть определена из командной строки использованием опции -D.
Когда использована форма (2), макрос должен вызываться с тем же количеством аргументов, с которыми он определен. Любые arg. и value будут заменены соответствующими аргументами и значениями, когда макрос расширяется. Отметьте, что левые скобки должны идти сразу после имени (никаких пробелов между ними), в противном случае это будет интерпретировано как часть величины макроса формы (1).
Примеры:
Обратите внимание на размещение первой скобки '(' в примерах, приведенных ниже.
#define EIGHT (1 << 3) #define SQR(X) ((X)*(X))
.UNDEF – отменить определение символьного имени регистра
Описание:
Отмена определения имени, которое прежде определялось директивой
.DEF или #define. Это позволит избежать сообщений об ошибке при многократном использовании регистра. Если имя прежде не определено, директива .undef будет проигнорирована, это в соответствии со стандартом ANSI C. То же можно сделать из командной строки, используя опцию -U.
Синтаксис:
.UNDEF символ
Пример:
.DEF var1 = R16 ldi var1, 0x20
... ; сделает что-то с использованием var1.
.UNDEF var1
.DEF var2 = R16 ; теперь использование R16 не будет вызывать предупреждения.
29