Директивы ассемблера не транслируются в коды операций, они используются для размещения программы в памяти, определяют макрокоманды, инициализируют память данных и выполняют ещё целый ряд различных вспомогательных операций, облегчающих процесс программирования. Полный список директив ассемблера AVR приведен в таблице 4.2.
Таблица 4.2. Директивы языка Atmel AVR Assembler
Директивы | Мнемоника | Наименование | |
byte | Reserve byte to a variable | Резервирование байта для переменной | |
cseg | Code Segment | Сегмент памяти программ | |
db | Define constant byte(s) | Определение однобайтной константы | |
def | Define a symbolic name on a register | Определение символического названия регистра | |
device | Define which device to assemble for | Определение устройства | |
dseg | Data Segment | Сегмент памяти данных | |
dw | Define Constant word(s) | Определение слова | |
endmacro | End macro | Конец макроса | |
equ | Set a symbol equal to an expression | Задание имени константы | |
eseg | EEPROM Segment | Сегмент EEPROM | |
exit | Exit from file | Конец файла | |
include | Read source from another file | Подключение файла | |
list | Turn listfile generation on | Включение генерации листинга | |
listmac | Turn Macro expansion in list file on | Включение макроса в листинг | |
nolist | Turn listfile generation off | Отключение генерации листинга | |
org | Set program origin | Задание начального адреса памяти | |
set | Set a symbol to an expression | Задание имени выражения |
Примечание: Любой директиве в тексте программы предшествует точка.
Выбор микроконтроллера
device
Директива device (Define which device to assemble for) сообщает ассемблеру о используемом контроллере. При использовании этой директивы генерируется предупреждение, если команда в программе не поддерживается точно выбранным контроллером. Если сегмент программы или сегмент EEPROM в программе больше, чем в выбранном устройстве, ассемблер также формирует предупреждение. Если директива не используется, то считается, что все команды ассемблера поддержаны и нет никаких ограничений на EEPROM и память программ.
Синтаксис:
.device at9Os120O |at90s2313 | at90s2323 | at90s2333 | at90s2343 | at90s4414 | at90s4433 | at90s4434 | at90s8515 | at90s8534 | at90s8535 | attiny11 | attiny12 | attiny22 | atmega603| atmega103| atmega163
Например,
.device atmega163 ; выбираем atmega163
Организация и резервирование памяти
Профамма на языке ассемблера обычно состоит из нескольких сегментов. Область памяти, в которой размещаются программы, называют сегментом кода, область памяти данных - сегментом данных, а область энергонезависимой памяти данных - сегментом EEPROM. Сегмент кода описывается директивой CSEG, сегмент данных - директивой DSEG, а сегмент EEPROM - ESEG.
cseg
Директива cseg (Code segment) определяет начало сегмента кода. Файл ассемблера может состоять нескольких сегментов, которые связаны в одну программу. В пределах сегмента кода cseg нельзя использовать директиву byte. Для размещения программ в сегменте кода используется директива org (см. далее). Директива cseg не имеет параметров.
Синтаксис:
.cseg
Например,
.dseg ; начало сегмента данных
vartab: .byte 4 | ; резервируется 4 байта в sram |
.cseg | ; начало сегмента кода |
const: .dw 2 | ; запись $0002 в память программ |
mov r1 ,r0 | ; пересылка |
dseg
Директива dseg (Data segment) определяет начало сегмента данных. Файл ассемблера может содержать несколько сегментов данных. Сегмент данных обычно состоит только из директив byte. Для размещения переменных в определенных байтах SRAM может использоваться директива org. Директива не имеет никаких параметров.
Синтаксис:
.dseg
Например,
.dseg ; начало сегмента данных
var1: .byte 1 ; резервируем 1 байт по адресу var1
table: .byte tab_size ; резервируем tab_size бай.
.cseg
ldi r30,low(var1) ; запись в младший байт регистра z
ldi г31 ,high(var1) ; запись в старший байт регистра z
ld r1,z ; пересылка из var1 в r
eseg-
Директива eseg (EEPROM Segment) определяет начало сегмента EEPROM. Файл ассемблера может содержать несколько сегментов EEPROM. Сегмент EEPROM обычно состоит только из директив db и dw. Для размещения данных в сегменте EEPROM может использоваться директива org. Директива eseg не имеет параметров.
Синтаксис:
.eseg
Например,
.dseg ; начало сегмента данных
va1: .byte 1 ; резервируется 1 байт для var
table: .byte tab_size ; резервируется tab_size байт
.eseg
eevar1: .dw 0xffff ; инициализируется 1 слово в eeprom
byte
Директива byte (Reserve bytes to a variable) резервирует байты в памяти данных (SRAM). Директиве должна предшествовать метка.. Директива имеет один параметр, который указывает на число резервируемых байт. Директива может быть использована только пределах сегмента данных (см. директиву dseg).
Синтаксис:
label: .byte expression
Например,
.dseg
va1: .byte 1 ; резервируется 1 байт для var
table: .byte tab_size ; резервируется tab_size байт
.cseg
ldi r30,low(var1) ; загрузка младшего байта регистра z
ldi г31 ,high(var1) ; загрузка старшего байта регистра z
ld r1,z ; загрузка var1 из регистра 1
Определение переменных
Директивы определения переменных позволяют включить данные в программу. Они указывают ассемблеру, что в соответствующем месте памяти программ или EEPROM располагается переменная, устанавливают её тип (байт или двухбайтное слово), задают начальные значения и ставят в соответствие переменным метки, которые впоследствии можно использовать при обращении к данным.
db
Директива db (Define constant byte(s) in program memory and EEPROM) определяет константы в памяти программ или EEPROM. Директиве db должна предшествовать метка. Директива db использует список выражений, содержащий, по крайней мере, одно выражение. Директива db должна быть размещена в сегменте кода или в сегменте EEPROM.
Список выражения - последовательность выражений, разграниченных запятыми. Каждое выражение должно иметь значение в пределах -128....255. Если выражение является отрицательным числом, оно будет представлено в дополнительном коде.
Если директива db расположена в сегменте программы cseg и список выражений содержит более чем одно выражение, то выражения упаковываются по два байта в каждом слове памяти программ. Если список выражений содержит нечетное число выражений, последнее выражение займет слово в памяти программ, даже если следующая строка в коде ассемблера снова содержит db директиву.
Синтаксис:
label: .db expressionlist
Например,
.cseg
consts: .db 0, 255, 0Ь01010101, -128, $aa
.eseg
const2: .db1,2,3
dw
Директива dw (Define constant word(s) in program memory and EEPROM) резервирует слово (2 байта) в памяти программ или EEPROM. Директиве должна предшествовать метка. Директива использует список выражений, состоящий не менее чем из одного выражения. Директива dw должна быть размещена в сегменте кода или в сегменте EEPROM.
Список выражений - последовательность выражений, разграниченных запятыми. Каждое выражение должно находится в пределах от -32768 до 65535. Отрицательные числа записываются в дополнительном коде.
Синтаксис:
label: .dw expressionlist
Например,
.cseg
varlist: .dw0, 0xffff, 0b1001110001010101, -32768, 65535
.eseg
eevarlst: .dw0,0xffff,10
def
Директива def (Set a symbolic name on a register) присваивает символические имена регистрам. Один регистр может иметь несколько символических имен. Символическое имя регистра может быть переопределено позже в программе.
Синтаксис:
.def symbol=register
Например,
.deftemp=r16
.def ior=r0
.cseg
ldi temp,0xf0 ; запись $f0 в регистр temp
in ior,$3f ;чтение регистра статуса sreg в регистр ior
еог temp,ior ; исключающее ИЛИ регистров temp и ior
еqи
Директива equ (Set a symbol equal to an expression) связывает константу с меткой. Эта метка может использоваться далее в программе. Метка, указывающая на константу в соответствии с директивой set, не может быть впоследствии переопределена.
Синтаксис
.equ label = expression
Директива .equ обычно используется для присвоения символических имен всем регистрам микроконтроллера, отдельным битам регистров и ячеек памяти, как это сделано, например, в приложении 1 в файле описания файле ATmega163def.inc.
set
Директива set (Set a symbol equal to an expression) присваивает имя выражению. Это имя может использоваться далее в программе. Имя, присвоенное выражению в соответствии с директивой set, может быть впоследствии изменено.
Синтаксис
.set label = expression
Например,
.set pina = $19 ; имя pina присваивается числу $19
.set porta = pina + 2 ; имя porta присваивается выражению $19+2=$1b
out porta,r2 ;Пересылка данных из регистра r2 в porta (по адресу $1 B)
Управление файлами
include
Директива include (Include another file) вставляет в текст программы заданный файл. Включенный файл может также содержать директивы include. Синтаксис: .include "filename" Например, .include "m163def.inc" подключаем файл описания микроконтроллера АТтеда163
Макросы
Макросом называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой macro и заканчивается директивой endmacro.
macro
Директива macro (begin macro) сообщает ассемблеру о начале макроса. Параметром директивы является название макроса. Макрос может содержать до 10 параметров. Эти параметры упоминаются как @0 - @9 в пределах макроопределения. При вызове макроса параметры перечисляются списком через запятую.
По умолчанию в листинге программы показывается только вызов макроса. Чтобы включить в листинг макроопределение необходимо использовать директиву LISTMAC. Макроопределения отмечаются в поле кода операции знаком «+».
Синтаксис:
.macro macroname
Например,
.macro subh 6 ; начало определения мароса
subi @1 ,low(@0) ; вычитание младшего байта
sbci @2,high(@0) ; вычитание старшего байта
.endmacro ; конец макроопределения
.cseg ; начало сегмента кода
subi16 0x1234,r16,r17 ; вычитание 0x1234 из r17:г16
Директива endmacro (End macro) определяет конец макроса. Директива не имеет никаких параметров.
Синтаксис: .endmacro
Например,.macro subh 6 ; начало определения макроса
subi r16,low(@0) ; вычитание low byte
sbci r17,high(@0) ; вычитание high byte .endmacro
Управление листингом
list
Директива list (Тит the list file generation on) сообщает ассемблеру о необходимости генерации листинга программы. Листинг - это файл, содержащий исходный текст программы, адреса и коды инструкций. По умолчанию генерация листинга считается включенной. Вместе с директивой NOLIST она позволяет генерировать листинги отдельных частей исходного файла.
Синтаксис:
.list
Например,
.nolist ; отключение генерации листинга
.include "macro.inc" ; подключение файла
.include "const.def ; подключение файла
.list ; включение генерации листинга
listmac
Директива listmac (Тит macro expansion on) включает в листинг программы текст макроса. По умолчанию в листинге показывается только вызов макроса с параметрами. Синтаксис:
.listmac | |
Например, | |
.macro macx | ; определение макроса |
add r0,@0 | |
eor r1,@1 | |
.endmacro | ; конец определения |
.listmac | ; включение макроса в листинг программы |
macx r2,r | ; выполнение макроса |
nolist
Директива nolist (Тит listfile generation off) выключает генерацию листинга. По умолчанию генерация листинга считается включенной. Директива может использоваться также вместе с директивой LIST для генерации листинга отдельных частей программы.
Синтаксис:
.NOLIST
Например,
.NOLIST ; отключение генерации листинга программы
.INCLUDE "macro.inc ; подключение файла
.INCLUDE "const.def" ; подключение файла
.LIST ; включение генерации листинга
Установка адресных счетчиков
ORG
Директива ORG (Set program origin) устанавливает счетчик адреса на определенное значение. Устанавливаемое значение задается как параметр. Если директива ORG записана в сегменте данных, то она устанавливает счетчик адреса SRAM. если в сегменте кода - то счетчик адреса программы, если в сегменте EEPROM - то счетчик адреса EEPROM. Если директиве предшествует метка на той же самой строке исходного текста, nj метке будет присвоено значение параметра. По умолчанию значения счетчиков адреса программы и EEPROM нулевые, а счетчика адреса данных - 32 (после регистров, занимающим адреса 0-31).
Синтаксис:
.org expression
Например,
.dseg ; сегмент данных
.org 0x37 ; адрес $37
variable: .byte 1 ; резервирование байта
.cseg ; сегмент кода
.org 0x10 ; установка программного счетчика на адрес $10
mov r0,r1 ;
Выход
exit
Директива exit (Exit this file) прекращает трансляцию файла. Обычно ассемблер выполняет трансляцию до конца файла. Если директива exit появляется в подключенном файле ассемблирование продолжается от строки, следующей за директивой include.
Синтаксис:
.exit
Например,
.exit ; конец трансляции