Материал: 1755

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

периферийных устройств и объемом памяти. Если у них общее вычислительное ядро, то они относятся к одному семейству МК, у которого имеется полный набор команд для самого сложного МК (с полным набором периферийных устройств и максимальным объемом памяти). Чем меньше периферийных устройств входят в состав конкретного МК, тем меньше для него набор инструкций, т.е. из общего набора инструкций исключаются те, которые относятся к отсутствующим периферийным устройствам.

Полный набор команд МК семейства AVR дан в разделе 5. Для более точной информации по командам конкретного МК обращайтесь к описанию команд инструкций в документации. Для конкретного МК полный набор команд будет усечен.

Кроме команд МК для удобства программирования, сжатия исходного текста, улучшения наглядности и читаемости программ в язык Ассемблер введены директивы, операторы, метки, комментарии и т.п. Этот набор дополняется и изменяется по мере совершенствования языка. Он обрабатывается препроцессором. Препроцессор обрабатывает текст исходного кода программы до его компиляции, преобразуя все дополнительные инструкции в команды МК. Он вызывается автоматически при запуске компилятора.

В состав AVR Studio входит компилятор с языка Ассемблер. Компилятор транслирует исходные коды с языка Ассемблера в объектный код, который не требует линковки, и может быть непосредственно запрограммирован в микроконтроллеры AVR. Полученный объектный код можно использовать в симуляторе ATMEL AVR Studio либо в эмуляторе

ATMEL AVR In-Circuit Emulator, а также в программном эмуляторе VMLAB. Компилятор работает под Microsoft Windows 9х XP.

Начиная с AVR Studio v. 4.11 (2005 г.), язык Ассемблер для AVR

дополнен новой частью AVR Assembler 2 (в дальнейшем AVRASM2). Получилась совместимая замена старого Ассемблера (в дальнейшем AVRASM) с новыми характеристиками. В данном учебном пособии отражены обновления Ассемблера до версии AVRASM2.1.9 (март 2007 г.).

1.3. Новое в AVR Assembler 2

Новые характеристики в AVRASM2 по сравнению с AVRASM:

препроцессор в Cи-стиле;

усложнение синтаксиса;

новые директивы Ассемблера;

улучшенное вычисление выражений;

не нужно задавать путь для включаемых файлов;

улучшение макроопределений.

5

Препроцессор AVRASM2 моделирует препроцессор языка Cи: выполняет замену идентификаторов (#define, #undef), условную компиляцию (#if, #endif, #else) и т.д.

Синтаксис Ассемблера немного усложнился, ключевые слова Ассемблера (команды, регистры, встроенные функции) не могут больше использоваться как символы (слова), определенные пользователем (метки, имена в директивах .def/.equ/.set). Даже если это будет являться причиной ошибок в существующих кодах (программах), это должно помочь избежать досадных ошибок в дальнейшем, так как программа становится удобочитаемой.

Введены новые директивы Ассемблера (см. ниже).

Улучшение вычисления выражений состоит в том, что постоянные выражения для операторов могут быть целыми или с плавающей точкой и вычисляться в соответствии с правилами приоритета Cи. Символы и операнды команд - всегда целые. До присваивания значения функции должна быть выполнена конверсия форматов операндов. При преобразовании float-->int выдается предупреждение, что дробная часть отброшена. Как целые числа, так и с плавающей точкой имеют 64битовое представление.

AVRASM2 поддерживает те же операторы, что и AVRASM, и дополнительно оператор % ( деление по модулю).

Дополнительно к функциям, поддерживаемым AVRASM, введены новые функции AVRASM2 (см. ниже).

Не нужно задавать путь для включаемых файлов, так как в отличие от AVRASM AVRASM2 знает, где расположена директория Appnotes.

Количество параметров в макросах AVRASM2 не ограничено (в AVRASM максимум 10).

В AVRASM2 допустим вложенный макровызов (т. е. один макрос вызывает другой), тем не менее постоянное использование этой возможности не рекомендовано.

2.СИНТАКСИС AVR АССЕМБЛЕРА

Исходные файлы языка Ассемблер – это текстовые файлы, состоящие из строк, содержащих инструкции (команды), метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.

Входная строка может иметь одну из четырёх форм: [метка:] директива [операнды] [Комментарий] [метка:] инструкция [операнды] [Комментарий] Комментарий Пустая строка.

6

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

Комментарий имеет следующую форму: ; [Текст]

Позиции в квадратных скобках необязательны. Текст после точки с запятой (;) и до конца строки игнорируется компилятором.

Метки, инструкции и директивы более детально описываются ниже.

Примеры:

label:

.EQU var1=100

; Устанавливает var1 равным 100 (Это

директива)

 

 

 

.EQU var2=200

; Устанавливает var2 равным 200

test:

rjmp test

; Бесконечный цикл (Это инструкция)

 

; Строка с одним только комментарием.

Компилятор не требует, чтобы метки, директивы, комментарии или инструкции находились в определённой колонке строки.

Основной синтаксис AVRASM совместим с AVRASM2 с исключениями, отмеченными ниже:

Ключевые слова.

Директивы препроцессора.

Комментарии.

Продолжения строк.

Строки и символьные константы.

Составные инструкции в строке.

Ключевые слова. В отличие от AVRASM встроенные идентификаторы (ключевые слова) зарезервированы и не могут быть переопределены. Ключевые слова включают все инструкции (команды), регистры R0-R31 и X, Y, Z и все функции. Ключевые слова Ассемблер распознаёт независимо от регистра, в котором они набраны, за исключением чувствительных к регистру опций, в которых ключевые слова набираются в нижнем регистре (т.е. "add" зарезервирован, а "ADD" – нет).

Директивы препроцессора. AVRASM2 считает директивами препроцессора все строки, начинающиеся с '#' (или первый непустой символ в строке, так как пробелы и символы табуляции игнорируются).

Комментарии. Дополнительно к классическим комментариям Ассемблера, начинающимся с ';', AVRASM2 признает комментарии в Cистиле:

. . . . . . . . . . ; Остальная часть строки является комментарием.

// Подобно ';' остальная часть строки является комментарием.

/* Блок комментариев может располагаться в нескольких строках.

Этот стиль комментариев не может быть вложенным */

7

Ассемблер

распознает разделители

комментария

(';') в стиле

AVRASM, а также комментарии Cи-стиля.

Однако ';'

используется в

синтаксисе языка Cи, что может привести к конфликту при использовании ';' в качестве разделителя комментария, поэтому не рекомендуется использовать комментарии в стиле Ассемблера вместе с директивами препроцессора AVRASM2.

Продолжение строки. Подобно Cи, строки исходных кодов могут быть продолжены посредством '\ '– обратной косой черты в конце строки. Это особенно полезно для длинных макроопределений препроцессора и для длинных директив .db.

Пример:

.db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11,12, 21, 214,235,634, \n', 0, 2, \ 12, 3,"’это продолжение верхней строки", '\n', 0, 3, 0

Строки и символьные константы. AVRASM2 понимает строки и символы так же, как AVRASM, кроме того, служебные символы, которые не поддерживаются AVRASM. Строка, заключенная в двойные кавычки ("), может быть использована только вместе с директивой .db. Строка передается буквально, никакие служебные символы и NUL-окончания не распознаются. Символьные константы, заключенные в одиночные кавычки ('), могут использоваться везде, где допустимо целое выражение.

Служебные символы в

Cи-стиле распознаются с тем же значением, как в

Cи (табл. 1).

 

Таблица 1

 

 

 

 

Служебные символы в Си-стиле

 

Служебные символы

 

Назначение

 

 

\n

 

Конец строки (ASCII LF 0x0a)

 

 

\r

 

Перевод строки (ASCII CR 0x0d)

 

 

\a

 

Звуковой сигнал Alert bell (ASCII BEL 0x07)

 

 

\b

 

Возврат каретки (ASCII BS 0x08)

 

 

\f

 

Подача формы (ASCII FF 0x0c)

 

 

\t

 

Горизонтальная таб. (ASCII HT 0x09)

 

 

\v

 

Вертикальная таб. (ASCII VT 0x0b)

 

 

\\

 

Обратная косая черта

 

 

\0

 

Нулевой символ (ASCII NUL)

 

Ассемблером также распознаются \ooo (ooo = восьмеричное число) и \xhh (hh = шестнадцатеричное число).

Примеры:

.db "Hello\n" // - эквивалент:

.db 'H', 'e', 'l', 'l', 'o', '\\', 'n,

Для того чтобы создать эквивалент Cи-строки "Привет, мир \n", делают следующим образом:

8

.db " Hello, world", '\n', 0

Составные инструкции в строке. AVRASM2 допускает составные инструкции (команды) и директивы в строке, но их использование не рекомендовано. Это нужно для того, чтобы поддерживать распаковку (расширение) многострочных макроопределений препроцессора.

Операнды. Дополнительно к операндам AVRASM AVRASM2 поддерживает выражения с плавающей точкой.

2.1. Инструкции процессоров AVR

Набор инструкций (команд) процессоров AVR приведен в табл. 2 – 5, более детальное описание их можно найти в разделе 5.

Таблица 2

Арифметические и логические инструкции

Мнемоника

Операнды

Описание

Операция

Флаги

Циклы

 

 

 

 

 

 

1

2

3

4

5

6

 

 

 

 

 

ADD

Rd,Rr

Суммирование без переноса

Rd = Rd + Rr

Z,C,N,V,H,S

1

 

 

 

 

 

 

ADC

Rd,Rr

Суммирование с переносом

Rd = Rd + Rr +

Z,C,N,V,H,S

1

C

 

 

 

 

 

 

SUB

Rd,Rr

Вычитание без переноса

Rd = Rd - Rr

Z,C,N,V,H,S

1

 

 

 

 

 

 

SUBI

Rd,K8

Вычитание константы

Rd = Rd - K8

Z,C,N,V,H,S

1

 

 

 

 

 

 

SBC

Rd,Rr

Вычитание с переносом

Rd = Rd - Rr -

Z,C,N,V,H,S

1

 

 

 

C

 

 

 

 

 

 

 

 

SBCI

Rd,K8

Вычитание константы с

Rd = Rd - K8 -

Z,C,N,V,H,S

1

 

 

переносом

C

 

 

 

 

 

 

 

 

AND

Rd,Rr

Логическое И

Rd = Rd · Rr

Z,N,V,S

1

 

 

 

 

 

 

ANDI

Rd,K8

Логическое И с константой

Rd = Rd · K8

Z,N,V,S

1

 

 

 

 

 

 

OR

Rd,Rr

Логическое ИЛИ

Rd = Rd V Rr

Z,N,V,S

1

 

 

 

 

 

 

ORI

Rd,K8

Логическое ИЛИ с

Rd = Rd V K8

Z,N,V,S

1

константой

 

 

 

 

 

 

 

 

 

 

 

EOR

Rd,Rr

Логическое исключающее

Rd = Rd EOR

Z,N,V,S

1

 

 

ИЛИ

Rr

 

 

 

 

 

 

 

 

COM

Rd

Побитная инверсия

Rd = $FF - Rd

Z,C,N,V,S

1

 

 

 

 

 

 

NEG

Rd

Изменение знака (доп. код)

Rd = $00 - Rd

Z,C,N,V,H,S

1

 

 

 

 

 

 

SBR

Rd,K8

Установить бит (биты) в

Rd = Rd V K8

Z,C,N,V,S

1

регистре

 

 

 

 

 

 

 

 

 

 

 

CBR

Rd,K8

Сбросить бит (биты) в

Rd = Rd · ($FF

Z,C,N,V,S

1

 

 

регистре

- K8)

 

 

 

 

 

 

 

 

INC

Rd

Инкрементировать

Rd = Rd + 1

Z,N,V,S

1

значение регистра

 

 

 

 

 

 

 

 

 

 

 

DEC

Rd

Декрементировать значение

Rd = Rd -1

Z,N,V,S

1

регистра

 

 

 

 

 

 

 

 

 

 

 

9