Директива .equ
Синтаксис .equ {символьное имя} = {выражение}
Пример:
.equ DDRA = 0x17; присвоение имени DDRA значения 0x17
.equ PORTA = DDRA + 5; присвоение имени PORTA значе-
ния 0x1C
Директива .set производит то же самое действие, что и .equ. Но в от-
личие от последней, символьное имя может быть переопределено в любом ме-
сте программы.
Директива .set
Синтаксис .set {символьное имя} = {выражение}
Пример:
.set OFFSET_X = 0x200; присвоение имени OFFSET значе-
ния 0x200
------|ваш код|-------
.set OFFSET_X = OFFSET_X + 1 ;переопределение значе-
ния OFFSET
Директива .def присваивает ваше символьное имя одному из регистров
общего назначения. В дальнейшем ходе программы данное имя может быть от-
менено директивой .undef.
Директива .def, .undef
Синтаксис .def {символьное имя} = {регистр общего
назнач.}
.undef {символьное имя}
Пример:
.def temp = R15; присвоение регистру R15 имя temp
------|ваш код|-------
.undef temp ; отмена дальнейшего использования имени
temp
63
Директивы .db, .dw, .dd, .dq предназначены для резервирования памяти
во FLASH или EEPROM микроконтроллера под инициализированные данные.
Все они могут применяться только в сегментах кода и EEPROM-памяти. Разница
между этими директивами заключается в разрядности представляемых данных.
Директива .db резервирует байты, .dw – слова, .dd – двойные слова. В ред-
ких случаях также может оказаться удобным использование директивы .dq,
резервирующей 64-разрядные данные. Данные могут представлять собой буквы
в ASCII формате, строки теста, впоследствии выводимые на дисплей, либо
начальные значения установок в приборе.
Директива .db, .dw, .dd, .dq
Синтаксис {метка}: .db {8-разрядные данные}
{метка}: .dw {16-разрядные данные}
{метка}: .dd {32-разрядные данные}
{метка}: .dq {64-разрядные данные}
Пример:
label:
.db 0xFA, 250, -6, 0b11111010
.dw 0xFADE, 64222, -1314, 0b1111101011011110
.dd 0xFADEEFCA, 4208914378, -86052918
.dq 0xFADEEFCAEFBACDEF, 18077149609196178927,
-521103510453211
Директива .byte резервирует память под неинициализированные дан-
ные в сегментах SRAM и EEPROM.
Директива .byte
Синтаксис {метка}: .byte {количество резервируемых
данных}
Пример:
.equ PAGESIZE = 0x20
buffer: .byte 2*PAGESIZE; резервирование 64 байт в
SRAM
Директивы .dseg, .eseg, .cseg определяют начало сегментов кода, дан-
ных и EEPROM-памяти соответственно, т. е. размещают данные в разных типах
памяти микроконтроллера (памяти программ, данных, EEPROM). Первая буква
64
директивы обозначает тип памяти, например .eseg отвечает за e – EEPROM,
d – данных, с – кода. В исходном файле каждый из сегментов может быть
представлен только в одном экземпляре. В случае если все эти директивы от-
сутствуют в программе, компилятор по умолчанию считает, что все операторы
расположены в секции кода.
Директива .dseg, .eseg, .cseg
Синтаксис .dseg
.eseg
.cseg
Пример:
.dseg ; начало сегмента данных
buffer: .byte 32 ; резервирование 32 байт под
буфер в SRAM
.cseg ;начало сегмента кода
rjmp initial
string: .db "ATmega16",0 ; строка, хранящаяся во
FLASH-памяти
.eseg ;начало сегмента EEPROM-памяти
_var: .byte 2 ;резервирование 2 байт под переменную
_var
_cnst: .db 0xAA ;резервирование байта под переменную
_cnst = 0xAA
Директива .org позволяет задать компилятору начальный адрес в преде-
лах сегментов кода, данных и EEPROM-памяти. В случае применения в сегменте
кода директива определяет адрес размещения 16-разрядного слова программ.
Директива .org
Синтаксис .org {начальный адрес}
Пример:
.equ SRAM_START = 0x60
.equ RAMEND = 0x045F
.dseg ;начало сегмента данных
65
.org SRAM_START ;резервирование 32 байт в SRAM под
буфер,
buffer: . byte 32 ;начиная с адреса 0x60
.cseg ;начало сегмента кода
.org 0 ;вектор сброса по адресу 0
rjmp initial
.org 0x50 ;начало основной программы с адреса 0x50
initial:
ldi temp,high(RAMEND) ;инициализация стека
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
Директива .DEVICE позволяет указать, для какого устройства компили-
руется программа. При использовании данной директивы компилятор выдаст
предупреждение, если будет найдена инструкция, которую не поддерживает
данный микроконтроллер. Также будет выдано предупреждение, если про-
граммный сегмент либо сегмент EEPROM превысят размер, допускаемый
устройством. Если же директива не используется, то все инструкции считаются
допустимыми и отсутствуют ограничения на размер сегментов.
Директива .DEVICE
Синтаксис .DEVICE {контроллер}
Пример:
.DEVICE AT90S1200 ; Используется AT90S1200
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Контрольные вопросы по главе 5
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
1.
Поясните разряды регистра состояния SREG.
2.
Каково назначение программного счетчика?
3.
Опишите принцип выполнения программы.
4.
Опишите назначение и принцип работы указателя стека.
5.
Перечислите часто используемые директивы ассемблера.
6.
Поясните математические и логические операторы присвоения.
66
Do'stlaringiz bilan baham: |