Справка по Ассемблеру для AVR® Добро пожаловать в ATMEL® AVR® Assembler.
Пожалуйста выберите интересующий Вас пункт:
Общая информация Исходные коды Инструкции процессоров 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
| 1
| ADC
| Rd,Rr
| Суммирование с переносом
| Rd = Rd + Rr + C
| Z,C,N,V,H,S
| 1
| 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 - C
| Z,C,N,V,H,S
| 1
| SBCI
| Rd,K8
| Вычитание константы с переносом
| Rd = Rd - K8 - C
| Z,C,N,V,H,S
| 1
| 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 Rr
| Z,N,V,S
| 1
| 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 - K8)
| Z,C,N,V,S
| 1
| INC
| Rd
| Инкрементировать значение регистра
| Rd = Rd + 1
| Z,N,V,S
| 1
| DEC
| Rd
| Декрементировать значение регистра
| Rd = Rd -1
| Z,N,V,S
| 1
| TST
| Rd
| Проверка на ноль либо отрицательность
| Rd = Rd · Rd
| Z,C,N,V,S
| 1
| CLR
| Rd
| Очистить регистр
| Rd = 0
| Z,C,N,V,S
| 1
| SER
| Rd
| Установить регистр
| Rd = $FF
| None
| 1
| ADIW
| Rdl,K6
| Сложить константу и слово
| Rdh:Rdl = Rdh:Rdl + K6
| Z,C,N,V,S
| 2
| SBIW
| Rdl,K6
| Вычесть константу из слова
| Rdh:Rdl = Rdh:Rdl - K 6
| Z,C,N,V,S
| 2
| MUL
| Rd,Rr
| Умножение чисел без знака
| R1:R0 = Rd * Rr
| Z,C
| 2
| MULS
| Rd,Rr
| Умножение чисел со знаком
| R1:R0 = Rd * Rr
| Z,C
| 2
| MULSU
| Rd,Rr
| Умножение числа со знаком с числом без знака
| R1:R0 = Rd * Rr
| Z,C
| 2
| FMUL
| Rd,Rr
| Умножение дробных чисел без знака
| R1:R0 = (Rd * Rr) << 1
| Z,C
| 2
| FMULS
| Rd,Rr
| Умножение дробных чисел со знаком
| R1:R0 = (Rd *Rr) << 1
| Z,C
| 2
| FMULSU
| Rd,Rr
| Умножение дробного числа со знаком с числом без знака
| R1:R0 = (Rd * Rr) << 1
| Z,C
| 2
|
Инструкции ветвления Мнемоника
| Операнды
| Описание
| Операция
| Флаги
| Циклы
| RJMP
| k
| Относительный переход
| PC = PC + k +1
| None
| 2
| IJMP
| Нет
| Косвенный переход на (Z)
| PC = Z
| None
| 2
| EIJMP
| Нет
| Расширенный косвенный переход на (Z)
| STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND
| None
| 2
| JMP
| k
| Переход
| PC = k
| None
| 3
| RCALL
| k
| Относительный вызов подпрограммы
| STACK = PC+1, PC = PC + k + 1
| None
| 3/4*
| ICALL
| Нет
| Косвенный вызов (Z)
| STACK = PC+1, PC = Z
| None
| 3/4*
| EICALL
| Нет
| Расширенный косвенный вызов (Z)
| STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND
| None
| 4*
| CALL
| k
| Вызов подпрограммы
| STACK = PC+2, PC = k
| None
| 4/5*
| RET
| Нет
| Возврат из подпрограммы
| PC = STACK
| None
| 4/5*
| RETI
| Нет
| Возврат из прерывания
| PC = STACK
| I
| 4/5*
| CPSE
| Rd,Rr
| Сравнить, пропустить если равны
| if (Rd ==Rr) PC = PC 2 or 3
| None
| 1/2/3
| CP
| Rd,Rr
| Сравнить
| Rd -Rr
| Z,C,N,V,H,S
| 1
| CPC
| Rd,Rr
| Сравнить с переносом
| Rd - Rr - C
| Z,C,N,V,H,S
| 1
| CPI
| Rd,K8
| Сравнить с константой
| Rd - K
| Z,C,N,V,H,S
| 1
| SBRC
| Rr,b
| Пропустить если бит в регистре очищен
| if(Rr(b)==0) PC = PC + 2 or 3
| None
| 1/2/3
| SBRS
| Rr,b
| Пропустить если бит в регистре установлен
| if(Rr(b)==1) PC = PC + 2 or 3
| None
| 1/2/3
| SBIC
| P,b
| Пропустить если бит в порту очищен
| if(I/O(P,b)==0) PC = PC + 2 or 3
| None
| 1/2/3
| SBIS
| P,b
| Пропустить если бит в порту установлен
| if(I/O(P,b)==1) PC = PC + 2 or 3
| None
| 1/2/3
| BRBC
| s,k
| Перейти если флаг в SREG очищен
| if(SREG(s)==0) PC = PC + k + 1
| None
| 1/2
| BRBS
| s,k
| Перейти если флаг в SREG установлен
| if(SREG(s)==1) PC = PC + k + 1
| None
| 1/2
| BREQ
| k
| Перейти если равно
| if(Z==1) PC = PC + k + 1
| None
| 1/2
| BRNE
| k
| Перейти если не равно
| if(Z==0) PC = PC + k + 1
| None
| 1/2
| BRCS
| k
| Перейти если перенос установлен
| if(C==1) PC = PC + k + 1
| None
| 1/2
| BRCC
| k
| Перейти если перенос очищен
| if(C==0) PC = PC + k + 1
| None
| 1/2
| BRSH
| k
| Перейти если равно или больше
| if(C==0) PC = PC + k + 1
| None
| 1/2
| BRLO
| k
| Перейти если меньше
| if(C==1) PC = PC + k + 1
| None
| 1/2
| BRMI
| k
| Перейти если минус
| if(N==1) PC = PC + k + 1
| None
| 1/2
| BRPL
| k
| Перейти если плюс
| if(N==0) PC = PC + k + 1
| None
| 1/2
| BRGE
| k
| Перейти если больше или равно (со знаком)
| if(S==0) PC = PC + k + 1
| None
| 1/2
| BRLT
| k
| Перейти если меньше (со знаком)
| if(S==1) PC = PC + k + 1
| None
| 1/2
| BRHS
| k
| Перейти если флаг внутреннего переноса установлен
| if(H==1) PC = PC + k + 1
| None
| 1/2
| BRHC
| k
| Перейти если флаг внутреннего переноса очищен
| if(H==0) PC = PC + k + 1
| None
| 1/2
| BRTS
| k
| Перейти если флаг T установлен
| if(T==1) PC = PC + k + 1
| None
| 1/2
| BRTC
| k
| Перейти если флаг T очищен
| if(T==0) PC = PC + k + 1
| None
| 1/2
| BRVS
| k
| Перейти если флаг переполнения установлен
| if(V==1) PC = PC + k + 1
| None
| 1/2
| BRVC
| k
| Перейти если флаг переполнения очищен
| if(V==0) PC = PC + k + 1
| None
| 1/2
| BRIE
| k
| Перейти если прерывания разрешены
| if(I==1) PC = PC + k + 1
| None
| 1/2
| BRID
| k
| Перейти если прерывания запрещены
| if(I==0) PC = PC + k + 1
| None
| 1/2
| * Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.
Инструкции передачи данных Мнемоника
| Операнды
| Описание
| Операция
| Флаги
| Циклы
| MOV
| Rd,Rr
| Скопировать регистр
| Rd = Rr
| None
| 1
| MOVW
| Rd,Rr
| Скопировать пару регистров
| Rd+1:Rd = Rr+1:Rr, r,d even
| None
| 1
| LDI
| Rd,K8
| Загрузить константу
| Rd = K
| None
| 1
| LDS
| Rd,k
| Прямая загрузка
| Rd = (k)
| None
| 2*
| LD
| Rd,X
| Косвенная загрузка
| Rd = (X)
| None
| 2*
| LD
| Rd,X+
| Косвенная загрузка с пост-инкрементом
| Rd = (X), X=X+1
| None
| 2*
| LD
| Rd,-X
| Косвенная загрузка с пре-декрементом
| X=X-1, Rd = (X)
| None
| 2*
| LD
| Rd,Y
| Косвенная загрузка
| Rd = (Y)
| None
| 2*
| LD
| Rd,Y+
| Косвенная загрузка с пост-инкрементом
| Rd = (Y), Y=Y+1
| None
| 2*
| LD
| Rd,-Y
| Косвенная загрузка с пре-декрементом
| Y=Y-1, Rd = (Y)
| None
| 2*
| LDD
| Rd,Y+q
| Косвенная загрузка с замещением
| Rd = (Y+q)
| None
| 2*
| LD
| Rd,Z
| Косвенная загрузка
| Rd = (Z)
| None
| 2*
| LD
| Rd,Z+
| Косвенная загрузка с пост-инкрементом
| Rd = (Z), Z=Z+1
| None
| 2*
| LD
| Rd,-Z
| Косвенная загрузка с пре-декрементом
| Z=Z-1, Rd = (Z)
| None
| 2*
| LDD
| Rd,Z+q
| Косвенная загрузка с замещением
| Rd = (Z+q)
| None
| 2*
| STS
| k,Rr
| Прямое сохранение
| (k) = Rr
| None
| 2*
| ST
| X,Rr
| Косвенное сохранение
| (X) = Rr
| None
| 2*
| ST
| X+,Rr
| Косвенное сохранение с пост-инкрементом
| (X) = Rr, X=X+1
| None
| 2*
| ST
| -X,Rr
| Косвенное сохранение с пре-декрементом
| X=X-1, (X)=Rr
| None
| 2*
| ST
| Y,Rr
| Косвенное сохранение
| (Y) = Rr
| None
| 2*
| ST
| Y+,Rr
| Косвенное сохранение с пост-инкрементом
| (Y) = Rr, Y=Y+1
| None
| 2
| ST
| -Y,Rr
| Косвенное сохранение с пре-декрементом
| Y=Y-1, (Y) = Rr
| None
| 2
| ST
| Y+q,Rr
| Косвенное сохранение с замещением
| (Y+q) = Rr
| None
| 2
| ST
| Z,Rr
| Косвенное сохранение
| (Z) = Rr
| None
| 2
| ST
| Z+,Rr
| Косвенное сохранение с пост-инкрементом
| (Z) = Rr, Z=Z+1
| None
| 2
| ST
| -Z,Rr
| Косвенное сохранение с пре-декрементом
| Z=Z-1, (Z) = Rr
| None
| 2
| ST
| Z+q,Rr
| Косвенное сохранение с замещением
| (Z+q) = Rr
| None
| 2
| LPM
| Нет
| Загрузка из программной памяти
| R0 = (Z)
| None
| 3
| LPM
| Rd,Z
| Загрузка из программной памяти
| Rd = (Z)
| None
| 3
| LPM
| Rd,Z+
| Загрузка из программной памяти с пост-инкрементом
| Rd = (Z), Z=Z+1
| None
| 3
| ELPM
| Нет
| Расширенная загрузка из программной памяти
| R0 = (RAMPZ:Z)
| None
| 3
| ELPM
| Rd,Z
| Расширенная загрузка из программной памяти
| Rd = (RAMPZ:Z)
| None
| 3
| ELPM
| Rd,Z+
| Расширенная загрузка из программной памяти с пост-инкрементом
| Rd = (RAMPZ:Z), Z = Z+1
| None
| 3
| SPM
| Нет
| Сохранение в программной памяти
| (Z) = R1:R0
| None
| -
| ESPM
| Нет
| Расширенное сохранение в программной памяти
| (RAMPZ:Z) = R1:R0
| None
| -
| IN
| Rd,P
| Чтение порта
| Rd = P
| None
| 1
| OUT
| P,Rr
| Запись в порт
| P = Rr
| None
| 1
| PUSH
| Rr
| Занесение регистра в стек
| STACK = Rr
| None
| 2
| POP
| Rd
| Извлечение регистра из стека
| Rd = STACK
| None
| 2
| * Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.
Инструкции работы с битами Мнемоника
| Операнды
| Описание
| Операция
| Флаги
| Циклы
| LSL
| Rd
| Логический сдвиг влево
| Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)
| Z,C,N,V,H,S
| 1
| LSR
| Rd
| Логический сдвиг вправо
| Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)
| Z,C,N,V,S
| 1
| ROL
| Rd
| Циклический сдвиг влево через C
| Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)
| Z,C,N,V,H,S
| 1
| ROR
| Rd
| Циклический сдвиг вправо через C
| Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)
| Z,C,N,V,S
| 1
| ASR
| Rd
| Арифметический сдвиг вправо
| Rd(n)=Rd(n+1), n=0,...,6
| Z,C,N,V,S
| 1
| SWAP
| Rd
| Перестановка тетрад
| Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)
| None
| 1
| BSET
| s
| Установка флага
| SREG(s) = 1
| SREG(s)
| 1
| BCLR
| s
| Очистка флага
| SREG(s) = 0
| SREG(s)
| 1
| SBI
| P,b
| Установить бит в порту
| I/O(P,b) = 1
| None
| 2
| CBI
| P,b
| Очистить бит в порту
| I/O(P,b) = 0
| None
| 2
| BST
| Rr,b
| Сохранить бит из регистра в T
| T = Rr(b)
| T
| 1
| BLD
| Rd,b
| Загрузить бит из T в регистр
| Rd(b) = T
| None
| 1
| SEC
| Нет
| Установить флаг переноса
| C =1
| C
| 1
| CLC
| Нет
| Очистить флаг переноса
| C = 0
| C
| 1
| SEN
| Нет
| Установить флаг отрицательного числа
| N = 1
| N
| 1
| CLN
| Нет
| Очистить флаг отрицательного числа
| N = 0
| N
| 1
| SEZ
| Нет
| Установить флаг нуля
| Z = 1
| Z
| 1
| CLZ
| Нет
| Очистить флаг нуля
| Z = 0
| Z
| 1
| SEI
| Нет
| Установить флаг прерываний
| I = 1
| I
| 1
| CLI
| Нет
| Очистить флаг прерываний
| I = 0
| I
| 1
| SES
| Нет
| Установить флаг числа со знаком
| S = 1
| S
| 1
| CLN
| Нет
| Очистить флаг числа со знаком
| S = 0
| S
| 1
| SEV
| Нет
| Установить флаг переполнения
| V = 1
| V
| 1
| CLV
| Нет
| Очистить флаг переполнения
| V = 0
| V
| 1
| SET
| Нет
| Установить флаг T
| T = 1
| T
| 1
| CLT
| Нет
| Очистить флаг T
| T = 0
| T
| 1
| SEH
| Нет
| Установить флаг внутреннего переноса
| H = 1
| H
| 1
| CLH
| Нет
| Очистить флаг внутреннего переноса
| H = 0
| H
| 1
| NOP
| Нет
| Нет операции
| Нет
| None
| 1
| SLEEP
| Нет
| Спать (уменьшить энергопотребление)
| Смотрите описание инструкции
| None
| 1
| WDR
| Нет
| Сброс сторожевого таймера
| Смотрите описание инструкции
| None
| 1
| Ассемблер не различает регистр символов.
Операнды могут быть таких видов:
Rd: Результирующий (и исходный) регистр в регистровом файле Rr: Исходный регистр в регистровом файле b: Константа (3 бита), может быть константное выражение s: Константа (3 бита), может быть константное выражение P: Константа (5-6 бит), может быть константное выражение K6; Константа (6 бит), может быть константное выражение K8: Константа (8 бит), может быть константное выражение k: Константа (размер зависит от инструкции), может быть константное выражение q: Константа (6 бит), может быть константное выражение Rdl: R24, R26, R28, R30. Для инструкций ADIW и SBIW X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30) |