Директивы ассемблера (.BYTE; .DB(.DW); .DEF)

Страницы работы

Содержание работы

Директивы ассемблера

Директивы не порождают исполнительный код, а лишь являются управляющими указателями для самого ассемблера. Они инициализируют участки памяти, определяют константы в памяти ,устанавливают счётчик команд из опред.адресс.

Все директивы начинаются с точки.

В  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    

Похожие материалы

Информация о работе