Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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

Правила программирования на языке Assembler

Директивы языка АССЕМБЛЕР.

 

Правила программирования на языке Ассемблер

Компилятор языка Assembler преобразует текст из программы, написанной на языке Assembler в машинные коды, которые в последующем записываются в область ПЗУ процессора.

Программа на языке Assembler содержит команды, метки и директивы. Команды и директивы, как правило, имеют один или несколько операндов.

Любая строка программы может начинаться с метки, которая является набором символов, заканчивающихся двоеточием.

Метки используются для определения места, в которое передается управление при переходах, реализуемых командами передачи управления (ветвления). Метки используются также для задания имен переменных.

Строка программы на языке Assembler может иметь одну из 4-х форм:

1. [метка] _ директива _ [операнды] _ [комментарий]

2. [метка] _ команда _ [операнды] _ [комментарий]

3. комментарий

4. пустая строка

 

Комментарии имеют форму, состоящую из 2-х элементов:

; [текст]

Позиции в [ ] являются не обязательными.

Текст после “; “ до конца строки игнорируется компилятором. Длина строки не должна превышать 120 символов.

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

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

Директива 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

 

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

 

<== предыдущая лекция | следующая лекция ==>
Команды языка ассемблер. Основные логические команды AVR-контроллера | Структура программы на языке СИ
Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал