Лекция 3
Основы программирования на ассемблере AVR
Компилятор транслирует исходные коды с языка ассемблера в объектный код. Полученный объектный код можно использовать в симуляторе ATMEL AVR Studio, либо в эмуляторе ATMEL AVR In-Circuit Emulator. Компилятор также генерирует код, который может быть непосредственно запрограммирован в микроконтроллеры AVR.
Компилятор генерирует код, который не требует линковки.
Компилятор работает под Microsoft Windows 3.11, Microsoft Windows95 и Microsoft Windows NT. Кроме этого есть консольная версия для MS-DOS.
Набор инструкций семейства микроконтроллеров AVR описан в данном документе кратко, для более полной информации по инструкциям обращайтесь к полному описанию инструкций и документации по конкретному микроконтроллеру.
Исходные коды
Компилятор работает с исходными файлами, содержащими инструкции, метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.
Строка кода не должна быть длиннее 120 символов.
Любая строка может начинаться с метки, которая является набором символов заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.
|
|
Входная строка может иметь одну из четырёх форм:
[метка:] директива [операнды] [Комментарий]
[метка:] инструкция [операнды] [Комментарий]
Комментарий
Пустая строка
Комментарий имеет следующую форму:
; [Текст]
Позиции в квадратных скобках необязательны. Текст после точки с запятой (;) и до конца строки игнорируется компилятором. Метки, инструкции и директивы более детально описываются ниже.
Примеры:
label:.EQU var1=100; Устанавливает var1 равным 100 (Это директива)
.EQU var2=200; Устанавливает var2 равным 200
test: rjmp test; Бесконечный цикл (Это инструкция)
; Строка с одним только комментарием
; Ещё одна строка с комментарием
Компилятор не требует чтобы метки, директивы, комментарии или инструкции находились в определённой колонке строки.
Инструкции процессоров AVR
Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book.
Арифметические и логические инструкции
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы |
ADD | Rd,Rr | Суммирование без переноса | Rd = Rd + Rr | Z,C,N,V,H,S | |
ADC | Rd,Rr | Суммирование с переносом | Rd = Rd + Rr + C | Z,C,N,V,H,S | |
SUB | Rd,Rr | Вычитание без переноса | Rd = Rd - Rr | Z,C,N,V,H,S | |
SUBI | Rd,K8 | Вычитание константы | Rd = Rd - K8 | Z,C,N,V,H,S | |
SBC | Rd,Rr | Вычитание с переносом | Rd = Rd - Rr - C | Z,C,N,V,H,S | |
SBCI | Rd,K8 | Вычитание константы с переносом | Rd = Rd - K8 - C | Z,C,N,V,H,S | |
AND | Rd,Rr | Логическое И | Rd = Rd · Rr | Z,N,V,S | |
ANDI | Rd,K8 | Логическое И с константой | Rd = Rd · K8 | Z,N,V,S | |
OR | Rd,Rr | Логическое ИЛИ | Rd = Rd V Rr | Z,N,V,S | |
ORI | Rd,K8 | Логическое ИЛИ с константой | Rd = Rd V K8 | Z,N,V,S | |
EOR | Rd,Rr | Логическое исключающее ИЛИ | Rd = Rd EOR Rr | Z,N,V,S | |
COM | Rd | Побитная Инверсия | Rd = $FF - Rd | Z,C,N,V,S | |
NEG | Rd | Изменение знака (Доп. код) | Rd = $00 - Rd | Z,C,N,V,H,S | |
SBR | Rd,K8 | Установить бит (биты) в регистре | Rd = Rd V K8 | Z,C,N,V,S | |
CBR | Rd,K8 | Сбросить бит (биты) в регистре | Rd = Rd · ($FF - K8) | Z,C,N,V,S | |
INC | Rd | Инкрементировать значение регистра | Rd = Rd + 1 | Z,N,V,S | |
DEC | Rd | Декрементировать значение регистра | Rd = Rd -1 | Z,N,V,S | |
TST | Rd | Проверка на ноль либо отрицательность | Rd = Rd · Rd | Z,C,N,V,S | |
CLR | Rd | Очистить регистр | Rd = 0 | Z,C,N,V,S | |
SER | Rd | Установить регистр | Rd = $FF | None | |
ADIW | Rdl,K6 | Сложить константу и слово | Rdh:Rdl = Rdh:Rdl + K6 | Z,C,N,V,S | |
SBIW | Rdl,K6 | Вычесть константу из слова | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | |
MUL | Rd,Rr | Умножение чисел без знака | R1:R0 = Rd * Rr | Z,C | |
MULS | Rd,Rr | Умножение чисел со знаком | R1:R0 = Rd * Rr | Z,C | |
MULSU | Rd,Rr | Умножение числа со знаком с числом без знака | R1:R0 = Rd * Rr | Z,C | |
FMUL | Rd,Rr | Умножение дробных чисел без знака | R1:R0 = (Rd * Rr) << 1 | Z,C | |
FMULS | Rd,Rr | Умножение дробных чисел со знаком | R1:R0 = (Rd *Rr) << 1 | Z,C | |
FMULSU | Rd,Rr | Умножение дробного числа со знаком с числом без знака | R1:R0 = (Rd * Rr) << 1 | Z,C |
|
|