Исходный файл, написанный на языке ассемблера, содержит мнемоники, директивы и метки.
Перед каждой строкой программы ставится метка, которая является алфавитно-цифровой строкой, заканчивающейся двоеточием. Метки используются как указания для безусловного перехода и команд условного перехода.
Строкой программы может быть директива, команда, комментарий. Допускается пустая строка в программе.
Комментарий имеет следующую форму:
; [Текст]
Любой текст после символа “ ; ” игнорируется ассемблером и имеет значение только для пользователя.
Операнды можно задавать в различных форматах:
- десятичный (по умолчанию): 10, 255
- шестнадцатеричный (два способа): 0´0а, $0а
- двоичный: 0b00001010, 0b11111111
- восьмеричный (впереди ноль): 010, 077
Директивы:
Директивой называются управляющими указаниями для программы ассемблера. Она не транслируется в код, как это делает команда. Они инициализируют участки памяти, определяют константы в памяти, устанавливают счетчик команд на определенный адрес и т.д.
Все директивы ассемблера приведены в табл. 6.
Таблица 6. Директивы ассемблера
Директива | Описание |
BYTE | Зарезервировать байт под переменную |
CSEG | Сегмент кодов |
DB | Задать постоянным(и) байт(ы) в памяти |
DEF | Задать символическое имя регистру |
DEVICE | Задать для какого типа микроконтроллера компилировать |
DSEG | Сегмент данных |
DW | Задать постоянное(ые) слово(а) в памяти |
EQU | Установите символ равный выражению |
ESEG | Сегмент EEPROM |
EXIT | Выход из файла |
INCLUDE | Включить исходный код из другого файла |
LIST | Включить генерацию .lst - файла |
NOLIST | Выключить генерацию .lst - файла |
ORG | Начальный адрес программы |
SET | Установите символ равный выражению |
Синтаксис всех директив следующий:
.[директива]
То есть перед директивой должна стоять точка. Иначе ассемблер воспринимает это как метку.
1. Директива CSEG (Code segment) указывает на начало сегмента кодов. Ассемблируемый файл может иметь несколько кодовых сегментов, которые будут объединены в один при ассемблировании.
Синтаксис:
.CSEG
Пример:
.DSEG ; Начало сегмента данных
vartab: .BYTE 4 ; Резервируется 4 байта в СОЗУ
.CSEG ; Начало сегмента кодов
const: .DW 2 ; Записать 0x0002 в программной памяти
mov r1,r0 ; Что-то делать
2. Директива DSEG (Data Segment) указывает на начало сегмента данных. Ассемблируемый файл может содержать несколько сегментов данных, которые потом будут собраны в один при ассемблировании. Обычно сегмент данных состоит лишь из директив BYTE и меток.
Синтаксис:
.DSEG
Пример:
.DSEG ; Начало сегмента данных
var1: .BYTE 1 ;Резервировать 1 байт под переменную table: .BYTE tab_size ; Резервировать tab_size байтов.
.CSEG
ldi r30,low(var1)
ldi r31,high(var1)
ld r1,Z
3. Директива ESEG (EEPROM Segment) указывает на начало сегмента EEPROM памяти. Ассемблируемый файл может содержать несколько EEPROM сегментов, которые будут собраны в один сегмент при ассемблировании. Обычно сегмент EEPROM состоит из DB и DW директив (и меток). Сегмент EEPROM памяти имеет свой собственный счетчик. Директива ORG может использоваться для размещения переменных в нужной области EEPROM.
Синтаксис:
.ESEG
Пример:
.DSEG ;Начало сегмента данных
var1:.BYTE 1 ; Резервировать 1 байт под переменную
table: .BYTE tab_size ; Зарезервировать tab_size байт.
.ESEG
eevar1: .DW 0xffff ; Записать 1 слово в EEPROM
4. Директива ORG присваивает значения локальным счетчикам. Используется только совместно с директивами .CSEG, .DSEG, .ESEG.
Синтаксис:
.ORG адрес
Пример:
.DSEG ; Начало сегмента данных
.ORG 0x37 ; Установить адрес СОЗУ на 37h
variable: .BYTE 1 ;Зарезервировать байт СОЗУ по адресу 37h
.CSEG
.ORG 0x10 ;Установить счетчик команд на адрес 10h
mov r0,r1 ; Чего-нибудь делать
5. Директива DB резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DB задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –128 и 255.
Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове Flash-памяти.
Синтаксис:
LABEL: .DB список выражений
Пример:
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa
.ESEG
const2: .DB 1,2,3
6. Директива DW резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DW задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –32768 и 65535.
Синтаксис:
LABEL: .DW список выражений
Пример:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535
.ESEG
eevarlst: .DW 0,0xffff,10
7. Директива DEF позволяет присвоить символическое имя регистру. Регистр может иметь несколько символических имен.
Синтаксис:
.DEF Имя=Регистр
Пример:
.DEF temp=R16
.DEF ior=R0
.CSEG
ldi temp,0xf0 ; Загрузить 0xf0 в регистр temp
in ior,0x3f ; Прочитать SREG в регистр ior
eor temp,
8. Директива EQU присваивает значение метке. Эта метка может быть использована в других выражениях. Значение этой метки нельзя изменить или переопределить.
Синтаксис:
.EQU метка=выражение
Пример:
.EQU io_offset = 0x23
.EQU porta = io_offset + 2
.CSEG ; Начало сегмента кодов
clr r2 ; Очистить регистр r2
out porta,r2 ; Записать в порт А
9. Директива INCLUDE говорит Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.
Синтаксис:
.INCLUDE "имя файла"
Пример:
.EQU sreg = 0x3f ; Регистр статуса
.EQU sphigh = 0x3e ; Старший байт указателя стека.
.EQU splow = 0x3d ; Младший байт указателя стека.
.INCLUDE iodefs.asm ; Включить файл «iodefs.asm»
in r0,sreg ; Прочитать регистр статуса
10. Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.
Синтаксис:
.EXIT
Пример:
.EXIT ; выйти из этого файла
11. Директива DEVICE позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.
Синтаксис:
.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103 | Atmega8535
Пример:
.DEVICE ATmega8535 ;использовать ATmega8535
.CSEG
.ORG 0000
jmp label1 ;При ассемблировании появиться сообщение, что
;ATmega8535 не поддерживает команду jmp
Дата: 2018-12-28, просмотров: 277.