Директивы ассемблера
Директивы не порождают исполнительный код, а лишь являются управляющими указателями для самого ассемблера. Они инициализируют участки памяти, определяют константы в памяти ,устанавливают счётчик команд из опред.адресс.
Все директивы начинаются с точки.
В AVR микроконтроллерах имеется три памяти:
Флеш память программ;
ОЗУ данных;
ПЗУ данных.
Для определения типа памяти, в которую помещается код, используют директивы:
.CSEG –начало сегмента кода ( или памяти программ);
.DSEG – начало сегмента данных ( или ОЗУ данных);
.ESEG –начало сегмента ПЗУ данных.
(Если в программе нет явного указания сегмента, по умолчанию считается, что это сегмент кода.)
Директива { .BYTE n - резервирует «n» байт в ОЗУ данных для переменной или массива. Может использоваться только в сегменте данных (DSEG).
Формат: имя _ переменной (массива):.BYTE число
Пример: .DSEG
Var1 : . Byte 1
Mas: . BYTE G
.CSEG
LDI R16, 0*DBB
STS var1, R16 ; запись DB(h) в переменную Var1
LDS R0 , Var1 ; чтение переменной Var1
Директива .DB(.DW) –резервирует байт (16-р слово) – константу в памяти программ или ПЗУ данных.
Формат : имя_константы : . DB число в диапазоне -128…255
.DW число в диапазоне -32768…65535
Пример: .CSEG
KB1 : . DB 4
KW1 : . DW 0x00FF
.ESEG
KB2 : . DB 0b 11110000
Директивы можно использовать также для размещения в памяти программ или ПЗУ массивов или таблиц данных.
Пример: .DSEG
Mas: . BYTE 4 ; выделение памяти под массив из 4х байт в ОЗУ данных
.CSEG
RJMP START
Mas: . DB 1,2,3,4 ; массив из 4х байт в памяти программы с инициализацией
START:
LDI YL , low(Mas1) ;инициализация регистра Y адресом элемента Mas1 Х[0]
LDI YH , high(Mas1)
LDI ZL , lov(Mas2) ;инициализация рнгистра Z адрессом элемента Mas[0]
LDI ZH , high(Mas2)
LDI R17 , 4 ; инициализация счётчика циклов
LOOP:
LPM R16 , Z+ ;копирование Mas[i] ---> Mas1[i]
ST Y+ , R16 i=1,2,3
DEC R17 : ; декремент счётчика циклов
BRNE LOOP
.EXIT
Директива .DEF - назначает регистру символическое имя
Пример: .DEF temp = R16 к R16 можно обращаться по двум именам
.DEF work = R16
.DEF counter = R17
.CSEG
LDI temp , 0xF0
Директива .INCLUDE – вставляет в исходный текст программы, текст из указанного файла.
Пример: .INCLUDE “m128def.inc”
.INCLUDE “IO.sam” :файл с подпрограммами пользователя
Директива .ORG – перейти на адрес ( устанавливает счётчик адреса текущего сегмента на указанный в директиве адрес).
Пример: .DSEG
.CRG 0x37 ; установит адрес ОЗУ – 37Н
Var : . BYTE1 ; зарезервировать байт по адресу 37Н
.ESEG
.ORG 0x20
.cevar : .DW oxDB70 ; инициализировать слово в ПЗУ по адресу 20Н
.CSEG
.ORG 0x10
MOV R0,R1, ; поместить команду в памяти программ по адресу 10Н
(обратите внимание, что в ОЗУ и ПЗУ отсчитываются байты, а в памяти программ – 16-разрядные слова.)
Директивы .MACRO ; начало и конец макро подстановки (макроса) макрос описывается один
.ENDM ;раз в начале программы .Когда в тексте программы встречается имя макроса, вместо него в программу вставляется команды, входящие в макрос. Вызов макроса может содержать до десяти параметров, перечисляемых через запятую. Внутри макроса, параметры задаются именами @0…@9, где цифра показывает порядок параметра при вызове.
Примеры макросов :
а) 16- разрядное вычитание с константой :
.MACRO SUBI16
SUB @1,low(@0)
SBCI @2,high(@0)
.END
ГДЕ @0,@1,@2 – параметры макроса при вызове, цифры0,1,2-задают порядок следования параметров. Вызов макроса SUB16 в программе:
SUBI 0xFF00, R16, R17R
↓ ↓ ↓
@0 @1 @2
Действия макроса : R16-OOH-R16+флаг С
R17-FFH-C-R17
б)ИЛИ с константой :
.MACRO XRI
PUSH R16
LDI R16, @1
ECR@0,R16
POP R16
.ENDM
Вызов: XRI R17 , Mask
↓ ↓
@0 @1
в)Универсальный OUT :
Команды IN и OUT имеет 6-разрядное поле для адресации портов. т.е. адреса портов должны быть меньше 40(Н) =64(D).Такие адреса имеют только регистры каналов A,B,C,D,E .Каналы F и G имеют адреса регистров больше 40(Н) и к ним нужно обращаться как к ячейкам памяти.
Сделаем макрос UOUT, который позволит обращаться к любым портам вывода:
.MACRO UOUT
.if @0<0x40
OUT@0,@1
.else
STS @0,@1
.endif
.ENDM
Вызов: LDI R18,0xFF
UOUT DDRF,R18
UOUT PORTF , R18
↓ ↓
@0 @1
.MACRO UIN
.if @1<0x40
IN @0,@1
.else
LDS @0,@1
.endif
.ENDM
Вызов: LDI R19, 0x00
UOUT DDRG, R19
UIN R20 , PING
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.