Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Директивы языка ассемблер.
Правила программирования на языке 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
|