- •Программирование микроконтроллеров avr на языке ассемблера
- •Рецензенты:
- •Введение
- •1. Архитектура однокристальных микроконтроллеров семейства avr
- •2. Технические характеристики микроконтроллера aTmega32
- •3. Разработка программного обеспечения микроконтроллеров avr
- •3.1. Этапы разработки программного обеспечения однокристальных микроконтроллеров
- •3.2. Правила записи констант и выражений
- •3.3. Программная модель микроконтроллеров avr
- •3.4. Регистр статуса
- •3.5. Команды ассемблера
- •3.6. Директивы ассемблера
- •3.7. Настройка указателя стека
- •3.8. Работа с портами ввода-вывода
- •3.9. Работа с оперативной памятью данных
- •4. Интегрированная среда проектирования
- •4.1. Создание проекта в интегрированной среде проектирования avr studio 4.16
- •4.2. Отладка программы в avr studio 4.16
- •4.3. Загрузка программы в энергонезависимую память программ
- •Заключение
- •Библиографический список
- •Содержание
- •191028, Санкт-Петербург, ул. Моховая, 26
3.6. Директивы ассемблера
Директивы используются только на этапе разработки программы. Директивы не транслируются непосредственно в код операции. Они используются, чтобы корректировать местоположение программы в памяти, определить макроопределение (макрос), инициализировать память и т. д.
Рассмотрим некоторые директивы ассемблера для микроконтроллеров семейства AVR фирмы ATMEL. Все директивы начинаются с точки.
Директива «EQU» – Установить постоянное выражение:
Синтаксис команды: .EQU метка = выражение.
Пример:
.equ PORTB = $18 ; присвоить адресу «$18» имя PORTB
Директива «INCLUDE» – Вложить другой файл:
Синтаксис команды: .INCLUDE «имя_файла».
Пример:
.include “m32def.inc” ; включение файла описания имен
Включение файла описания имен позволяет в тексте программы использовать имена регистров специальных функций вместо их абсолютных адресов.
.equ SPH = $3e
.equ SPL = $3d
.equ PORTB = $18
.equ DDRB = $17
.equ PINB = $16
Варианты команды «out», используя выражение «PORTB = $18»:
ldi r16, $01
out $18, r16
или
ldi r16, $01
out PORTB, r16
Директива «LIST» – Включить листинг программы:
Директива «LIST» указывает Ассемблеру включить листинг программы в проект. Ассемблер генерирует листинг (Listfile), который является комбинацией исходного текста программы, адресов и кодов операции. Листинг включен по умолчанию (на вкладке «Assemble Options» в меню «Project» должна быть установлена галочка на опцию «Create List File»). Директива может также использоваться вместе с директивой «NOLIST», чтобы только генерировать листинг отобранных частей исходного файла.
В данном примере директивы «LIST» и «NOLIST» используются для того, чтобы в листинг программы не включать библиотеку описания имен.
Синтаксис команды: .LIST
Пример:
.NOLIST
.include “m32def.inc” ; подключение библиотеки имен
.LIST
Директива «CSEG» – Программный сегмент:
Директива «CSEG» определяет начало программного сегмента. Исходный файл может состоять из нескольких программных сегментов, которые объединяются в один программный сегмент при компиляции. Программный сегмент является сегментом по умолчанию. Программные сегменты имеют свои собственные счётчики положения, которые считают не побайтно, а пословно. Директива «ORG» может быть использована для размещения кода и констант в необходимом месте сегмента. Директива CSEG не имеет параметров.
Синтаксис команды: .CSEG.
Пример:
.CSEG ; начало кодового сегмента
const: .DW 2 ; разместить константу 0x0002 в памяти программ
mov r1,r0 ; выполнить действия
Директива «DB» – Определить байты в памяти программ или EEPROM:
Директива «DB» резервирует необходимое количество байт в памяти программ или в EEPROM. Директива DB должна быть предварена меткой. Директива DB должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).
Параметры, передаваемые директиве, – это последовательность выражений, разделённых запятыми. Каждое выражение должно быть или числом в диапазоне (-128..255), или в результате вычисления должно давать результат в этом же диапазоне, в противном случае число усекается до байта, причём БЕЗ выдачи предупреждений.
Если директива получает более одного параметра и текущим является программный сегмент, то параметры упаковываются в слова (первым параметром является младший байт), и если число параметров нечётно, то последнее выражение будет усечено до байта и записано как слово со старшим байтом, равным нулю, даже если далее идет ещё одна директива DB.
Синтаксис команды: МЕТКА: .DB список_выражений.
Пример 1:
.CSEG
const: .DB 0, 255, 0b01010101, -128, 0xaa
Пример 2:
.ESEG
const2: .DB 1, 2, 3
Пример 3:
.CSEG
message: ; метка начала сообщения
.DB “Hello World” ; текст сообщения
Директива «DW» – Определить слова во флэш или EEPROM:
Директива DW резервирует необходимое количество слов в памяти программ или в EEPROM. Если Вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DW должна быть предварена меткой. Директива DW должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).
Параметры, передаваемые директиве, – это последовательность выражений, разделённых запятыми. Каждое выражение должно быть или числом в диапазоне (-32768..65535), или в результате вычисления должно давать результат в этом же диапазоне, в противном случае число усекается до слова, причем БЕЗ выдачи предупреждений.
Синтаксис команды: МЕТКА: .DW список выражений.
Пример 1:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -3278, 65535
Пример 2:
.ESEG
eevarlist: .DB 0, 0xffff, 10