Menu
Директивы языка ассемблер
Директивы не транслируются непосредственно в машинный код. Они используются для указания компилятору положения кода в программной памяти, для инициализации памяти и для других целей.
Директива BYTE . Это директива резервирует байты ОЗУ (в области Data). Все директивы начинаются с символа «точка».
Пример №1:
.DSEQ
Var1: .BYTE 1
.CSEQ
ldi r30, low(varl)
ldi r31, high(varl)
ld r1, z
Директива .DSEQ . Определяет, что нижеследующие строки относятся к области Data ОЗУ. Эта директива не имеет операндов.
Директива .BYTE . Имеет один обязательный операнд, указывающий количество выделенных байтов.
Если необходимо чтобы обращение к выделенным байтам происходило по имени, то вводится метка (в данном случае это метка Var 1).
Директива .CSEQ. Указывает компилятору, что последующие строчки программы должны компилироваться и располагаться в области ПЗУ.
В последующих командах используется переменная Var 1, определяющая содержимое ячеек памяти ОЗУ.
Выражения low и high являются стандартными выражениями языка Assembler и предназначены для определения старшего и младшего байтов адреса переменной Var 1, указанного в качестве операнда этих выражений.
Пример №2: определить старший и младший байты числа 30010. Переводим 30010→Х16
300| 16
288| 18|16
12 16| 1|16
2 0| 0
1

30010→12C16
Старший байт – 01, младший байт – 2С.

Директива .DEF. Эта директива назначает регистру символическое имя. Это имя может использоваться в нижеследующей части программы для обращения к данному регистру. Символическое имя может быть переименовано в программе несколько раз. Синтаксис этой директивы следующий:
.DEF Символическое имя =регистр
Пример №3:
.DEF temp=R16
.DEF ior=R0
.CSEQ
.ldi _ temp, 0×f0
.eor temp, ior
Директива .DEVICE. Определяет устройство, для которого компилируется программа. Использование данной директивы позволяет компилятору выдать предупреждение, если появится команда, не поддерживаемая данным контроллером.
Пример №4:
.DEVICE AT90S2313

Директива .EQU.Позволяет определить константу путем задания ее меткой. Формат этой директивы:
.EQU метка=выражение
Пример №5:
.EQU io_offset=0×23
.EQU port a = io_offset+2
.CSEQ
clr r2
out port a, r2
Директива .include. Означает вложение другого файла (содержимое файла включается в программу при компиляции).
Встретив .include компилятор открывает указанный в этой директиве файл, компилирует его до конца (т.е. переводит в машинные коды) или до директивы .EXIT. После этого продолжается компиляция начального файла со строки, следующей за директивой include. Вложенный файл тоже может содержать директиву include.
Пример №6:
; файл iodefs.asm
.EQU sreq=0×3F
.EQU sphigh=0×3e
.EQU splow=0×3d
; файл incdemo.asm
.include iodefs.asm
in ro,sreg
Директива .ORG устанавливает счетчик в положение равным заданной величине, которая входит как параметр в эту директиву. Для сегмента данных она устанавливает счетчик положения ОЗУ, для сегмента программ или памяти программ она устанавливает содержимое РС (программного счетчика), а для сегмента Eeprom устанавливает положение в области Eeprom.
Если директиве предшествует метка, то она становится равной адресу, указанному в параметре директивы при компиляции программы.
Перед началом компиляции РС и счетчик Eeprom нулю, а счетчик ОЗУ=32.
Для ОЗУ и Eeprom используются побайтные счетчики, а для программного сегмента пословные.

Пример №7:
.DSEQ
.ORG 0×37
; variable: .BYTE 1
; резервирует байт по адресу 0×37
.CSEQ
.ORG 0×10
MOV RO, R1; данная команда размещается по адресу 0×10
Директива .SET присваивает метке определенное значение, которое далее может быть использовано в выражениях. В отличие от директивы EQU значение метки может быть изменено другой директивой .SET
Пример №8:
.SET io1=0×23
.SET PORTA=io1+1
.CSEQ
out PORTA, R2

Добавлять комментарии могут только зарегистрированные пользователи.
Регистрация Вход