![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Директивы ассемблера не транслируются в коды операций, они используются для размещения программы в памяти, определяют макрокоманды, инициализируют память данных и выполняют ещё целый ряд различных вспомогательных операций, облегчающих процесс программирования. Полный список директив ассемблера 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; конец трансляции
Дата публикования: 2014-11-03; Прочитано: 1615 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!