Директивы

 

Директивы ассемблера не транслируются в коды операций, они используются для размещения программы в памяти, определяют макрокоманды, инициализируют память данных и выполняют ещё целый ряд различных вспомогательных операций, облегчающих процесс программирования. Полный список директив ассемблера 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 ; конец трансляции