Ласкаво просимо в ATMEL AVR Assembler.

Будь ласка оберіть Ваш пункт:

Асемблер поставляється також в консольної версії, її використання описано в цьому файлі.

Загальна інформація

Компілятор транслює вихідні коди з мови асемблера в об'єктний код. Отриманий об'єктний код можна використовувати в симуляторі 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)

директиви асемблера

Компілятор підтримує ряд директив. Директиви не транслюються безпосередньо в код. Замість цього вони використовуються для вказівки положення в програмній пам'яті, визначення макросів, ініціалізації пам'яті і т.д. Список директив наведено в таблиці нижче.
 

Директива опис
BYTE Зарезервувати байти в ОЗУ
CSEG програмний сегмент
DB Визначити байти у флеш або EEPROM
DEF Призначити регістру символічне ім'я
DEVICE Визначити пристрій для якого компілюється програма
DSEG сегмент даних
DW Визначити слова у флеш або EEPROM
ENDM, ENDMACRO кінець макросу
EQU Встановити постійний вираз
ESEG сегмент EEPROM
EXIT Вийти з файлу
INCLUDE Вкласти інший файл
LIST Включити генерацію лістингу
LISTMAC Включити розгортання макросів в лістингу
MACRO початок макросу
NOLIST Вимкнути генерацію лістингу
ORG Встановити положення в сегменті
SET Встановити змінний символічний еквівалент вираження

Всі директиви предваряются точкою.

BYTE - Зарезервувати байти в ОЗУ

Директива BYTE резервує байти в ОЗУ. Якщо Ви хочете мати можливість посилатися на виділену область пам'яті, то директива BYTE повинна бути випереджу міткою. Директива приймає один обов'язковий параметр, який вказує кількість виділених байт. Ця директива може використовуватися тільки в сегменті даних (дивитися директиви CSEG і DSEG ). Виділені байти НЕ инициализируются.

Синтаксис:
МІТКА: .BYTE вираз

Приклад:
.DSEG
var1: .BYTE 1; резервує 1 байт для var1
table: .BYTE tab_size; резервує tab_size байт

.CSEG
         Ldi r30, low (var1); Завантажує молодший байт регістра Z
         ldi r31, high (var1); Завантажує старший байт регістра Z
         ld r1, Z; Завантажує VAR1 в регістр 1

CSEG - Програмний сегмент

Директива CSEG визначає початок програмного сегмента. Вихідний файл може складатися з декількох програмних сегментів, які об'єднуються в один програмний сегмент при компіляції. Програмний сегмент є сегментом за замовчуванням. Програмні сегменти мають свої власні лічильники положення які вважають не побайтно, а по немов. Директива ORG може бути використана для розміщення коду і констант в необхідному місці сегмента. Директива CSEG не має параметрів.

Синтаксис:
.CSEG

Приклад:
.DSEG; Початок сегмента даних
vartab: .BYTE 4; Резервує 4 байта в ОЗУ

.CSEG; Початок кодового сегмента
const: .DW 2; Розмістити константу 0x0002 в пам'яті програм
        mov r1, r0; виконати дії

DB - Визначити байти у флеш або EEPROM

Директива DB резервує необхідну кількість байт в пам'яті програм або в EEPROM. Якщо Ви хочете мати можливість посилатися на виділену область пам'яті, то директива DB повинна бути випереджу міткою. Директива DB повинна мати хоча б один параметр. Дана директива може бути розміщена тільки в сегменті програм ( CSEG ) або в сегменті EEPROM ( ESEG ).

Параметри передаються директиві - це послідовність виразів розділених комами. Кожен вираз має бути або числом в діапазоні (-128..255), або в результаті обчислення повинно давати результат в цьому ж діапазоні, в іншому випадку число усікається до байта, причому БЕЗ видачі попереджень.

Якщо директива отримує більше одного параметра і поточним є програмний сегмент, то параметри упаковуються в слова (перший параметр - молодший байт), і якщо число параметрів непарній, то останній вираз буде усечено до байта і записано як слово зі старшим байтом рівним нулю, навіть якщо далі йде ще одна директива DB.

Синтаксис:
МІТКА: .DB спісок_вираженій

Приклад:
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa

.ESEG
Const2: .DB 1,2,3

DEF - Призначити регістру символічне ім'я

Директива DEF дозволяє посилатися на регістр через деякий символічне ім'я. Призначене ім'я може використовуватися у всій нижченаведеної частини програми для звернень до даного регістру. Регістр може мати кілька різних імен. Символічне ім'я може бути перепризначено пізніше в програмі.

Синтаксис:
.DEF Сімволіческое_імя = Регістр

Приклад:
.DEF temp = R16
.DEF ior = R0

.CSEG
 Ldi temp, 0xf0; Завантажити 0xf0 в регістр temp (R16)
 in ior, 0x3f; Прочитати SREG в регістр ior (R0)
 eor temp, ior; Регістри temp і ior складаються по виключає або

DEVICE - Визначити пристрій для якого компілюється програма

Директива DEVICE дозволяє вказати для якого пристрою компілюється програма. При використанні даної директиви компілятор видасть попередження, якщо буде знайдена інструкція, яку не підтримує даний мікроконтролер. Також буде видано попередження, якщо програмний сегмент, або сегмент EEPROM перевищать розмір допускається пристроєм. Якщо ж директива не використовується то все інструкції вважаються допустимими, і відсутні обмеження на розмір сегментів.

Синтаксис:
.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

Приклад:
.DEVICE AT90S1200; використовується AT90S1200

.CSEG
        Push r30; Ця інструкція викличе попередження
                   ; оскільки AT90S1200 її немає

DSEG - Сегмент даних

Директива DSEG визначає початок сегмента даних. Вихідний файл може складатися з декількох сегментів даних, які об'єднуються в один сегмент при компіляції. Сегмент даних зазвичай складається тільки з директив BYTE і міток. Сегменти даних мають свої власні побайтное лічильники положення. Директива ORG може бути використана для розміщення змінних в необхідному місці ОЗУ. Директива не має параметрів.

Синтаксис:
.DSEG 

Приклад:
.DSEG; Початок сегмента даних
var1: .BYTE 1; зарезервувати 1 байт для var1
table: .BYTE tab_size; зарезервувати tab_size байт.

.CSEG
        Ldi r30, low (var1); Завантажити молодший байт регістра Z
        ldi r31, high (var1); Завантажити старший байт регістра Z
        ld r1, Z; Завантажити var1 в регістр r1

DW - Визначити слова у флеш або EEPROM

 

Директива DW резервує необхідну кількість слів у пам'яті програм або в EEPROM. Якщо Ви хочете мати можливість посилатися на виділену область пам'яті, то директива DW повинна бути випереджу міткою. Директива DW повинна мати хоча б один параметр. Дана директива може бути розміщена тільки в сегменті програм ( CSEG ) або в сегменті EEPROM ( ESEG ).

Параметри передаються директиві - це послідовність виразів розділених комами. Кожен вираз має бути або числом в діапазоні (-32768..65535), або в результаті обчислення повинно давати результат в цьому ж діапазоні, в іншому випадку число усікається до слова, причому БЕЗ видачі попереджень.

Синтаксис:
МІТКА: .DW expressionlist

Приклад:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

.ESEG
Eevarlst: .DW 0,0xffff, 10

ENDMACRO - Кінець макросу

Директива визначає кінець макроозначення, і не приймає ніяких параметрів. Для інформації щодо визначення макросів дивіться директиву MACRO .

Синтаксис:
.ENDMACRO 

Приклад:
.MACRO SUBI16; Початок визначення макросу
        subi r16, low (@ 0); Відняти молодший байт першого параметра
        sbci r17, high (@ 0); Відняти старший байт першого параметра
.ENDMACRO

EQU - Встановити постійне вираз

Директива EQU привласнює мітці значення. Ця мітка може пізніше використовуватися у виразах. Мітка якій присвоєно значення даної директиви не може бути перепризначено і її значення не може бути змінено.

Синтаксис:
.EQU мітка = вираз

Приклад:
.EQU io_offset = 0x23
.EQU porta = io_offset + 2

.CSEG; Початок сегмента даних
        clr r2; Очистити регістр r2
        out porta, r2; Записати в порт A

ESEG - Сегмент EEPROM

Директива ESEG визначає початок сегмента EEPROM. Вихідний файл може складатися з декількох сегментів EEPROM, які об'єднуються в один сегмент при компіляції. Сегмент EEPROM зазвичай складається тільки з директив DB , DW і міток. Сегменти EEPROM мають свої власні побайтное лічильники положення. Директива ORG може бути використана для розміщення змінних в необхідному місці EEPROM. Директива не має параметрів.

Синтаксис:
.ESEG   

Приклад:
.DSEG; Початок сегмента даних
var1: .BYTE 1; зарезервувати 1 байт для var1
table: .BYTE tab_size; зарезервувати tab_size байт.

.ESEG
Eevar1: .DW 0xffff; проинициализировать 1 слово в EEPROM

EXIT - Вийти з файлу

Зустрівши директиву EXIT компілятор припиняє компіляцію даного файлу. Якщо директива використана у вкладеному файлі (див. Директиву INCLUDE ), то компіляція триває з рядка наступної після директиви INCLUDE. Якщо ж файл не є вкладеним, то компіляція припиняється.

Синтаксис:
.EXIT

Приклад:
.EXIT; Вийти з даного файлу

INCLUDE - Вкласти інший файл

Зустрівши директиву INCLUDE компілятор відкриває вказаний в ній файл, компілює його поки файл не закінчиться або не трапиться директива EXIT , після цього продовжує компіляцію початкового файлу з рядка наступної за директивою INCLUDE. Вкладений файл може також містити директиви INCLUDE.

Синтаксис:
.INCLUDE "имя_файла"

Приклад:
; файл iodefs.asm:
.EQU sreg = 0x3f; Регістр статусу
.EQU sphigh = 0x3e; Старший байт покажчика стека
.EQU splow = 0x3d; Молодший байт покажчика стека

; файл incdemo.asm
.INCLUDE iodefs.asm; Вкласти визначення портів
        in r0, sreg; Прочитати регістр статусу

LIST - Включити генерацію лістингу

Директива LIST вказує компілятору на необхідність створення лістингу. Лістинг вдає із себе комбінацію ассемблерного коду, адрес і кодів операцій. За замовчуванням генерація лістингу включена, проте дана директива використовується спільно з директивою NOLIST для отримання листингов окремих частин вихідних файлів.

Синтаксис:
.LIST

Приклад:
.NOLIST; Відключити генерацію лістингу
.INCLUDE "macro.inc"; Вкладені файли не будуть
.INCLUDE "const.def"; відображені в лістингу
.LIST; Включити генерацію лістингу

LISTMAC - Включити розгортання макросів в лістингу

Після директиви LISTMAC компілятор буде показувати в лістингу вміст макросу. За замовчуванням в лістингу показується тільки виклик макросу і передані параметри.

Синтаксис:
.LISTMAC

Приклад:
.MACRO MACX; Визначення макросу
        add r0, @ 0; Тіло макросу
        eor r1, @ 1 
.ENDMACRO; кінець макроозначення

.LISTMAC; Включити розгортання макросів         MACX r2, r1; Виклик макроса (в лістингу буде показано тіло макросу)

MACRO - Початок макросу

З директиви MACRO починається визначення макросу. Як параметр директиві передається ім'я макросу. При зустрічі імені макросу пізніше в тексті програми, компілятор замінює це ім'я на тіло макросу. Макрос може мати до 10 параметрів, до яких в його тілі звертаються через @ 0- @ 9. При виклику параметри перераховуються через коми. Визначення макросу закінчується директивою ENDMACRO .

За замовчуванням в лістинг включається тільки виклик макросу, для розгортання макросу необхідно використовувати директиву LISTMAC . Макрос в лістингу показується знаком +. Синтаксис: .MACRO макроімен
 

Приклад:
.MACRO SUBI16; Початок макроозначення
        subi @ 1, low (@ 0); Відняти молодший байт параметра 0 з параметра 1
        sbci @ 2, high (@ 0); Відняти старший байт параметра 0 з параметра 2
.ENDMACRO; кінець макроозначення

.CSEG; Початок програмного сегмента
        SUBI16 0x1234, r16, r17; Відняти 0x1234 з r17: r16

NOLIST - Вимкнути генерацію лістингу

Директива NOLIST вказує компілятору на необхідність припинення генерації лістингу. Лістинг вдає із себе комбінацію ассемблерного коду, адрес і кодів операцій. За замовчуванням генерація лістингу включена, однак може бути відключена даної директиви. Крім того дана директива може бути використана спільно з директивою LIST для отримання листингов окремих частин вихідних файлів

Синтаксис:
.NOLIST

Приклад:
.NOLIST; Відключити генерацію лістингу
.INCLUDE "macro.inc"; Вкладені файли не будуть
.INCLUDE "const.def"; відображені в лістингу
.LIST; Включити генерацію лістингу

ORG - Встановити положення в сегменті

Директива ORG встановлює лічильник положення рівним заданій величині, яка передається як параметр. Для сегменту даних вона встановлює лічильник положення в SRAM (ОЗУ), для сегмента програм це програмний лічильник, а для сегмента EEPROM це положення в EEPROM. Якщо директиві передує мітка (в тому самому рядку) то мітка розміщується за адресою вказаною в параметрі директиви. Перед початком компіляції програмний лічильник і лічильник EEPROM дорівнюють нулю, а лічильник ОЗУ дорівнює 32 (оскільки адреси 0-31 зайняті регістрами). Зверніть увагу що для ОЗУ і EEPROM використовуються побайтное лічильники а для програмного сегмента - послівний.

Синтаксис:
.ORG вираз

Приклад:
.DSEG; Початок сегмента даних

.ORG 0x37; Встановити адресу SRAM рівним 0x37
variable: .BYTE 1; Зарезервувати байт за адресою 0x37H

.CSEG
.ORG 0x10; Встановити програмний лічильник рівним 0x10
          mov r0, r1; Дана команда буде розміщена за адресою 0x10

SET - Встановити змінний символічний еквівалент вираження

Директива SET привласнює імені деяке значення. Це ім'я пізніше може бути використано в виразах. Причому на відміну від директиви EQU значення імені може бути змінено інший директивою SET.

Синтаксис:
.SET ім'я = вираз

Приклад:
.SET io_offset = 0x23
.SET porta = io_offset + 2

.CSEG; Початок кодового сегмента
        clr r2; Очистити регістр 2
        out porta, r2; Записати в порт A

вирази

Компілятор дозволяє використовувати в програмі вираження які можуть складатися операндів , операторів і функцій . Всі вирази є 32-бітними.

операнди

Можуть бути використані наступні операнди:

  • Мітки певні користувачем (дають значення свого становища).
  • Змінні певні директиви SET
  • Константи певні директивою EQU
  • Числа задані в форматі:
    • Десятковому (прийнятий за замовчуванням): 10, 255
    • Шістнадцятковому (два варіанти запису): 0x0a, $ 0a, 0xff, $ ff
    • Довічним: 0b00001010, 0b11111111
    • Вісімковому (починаються з нуля): 010, 077
  • PC - поточне значення програмного лічильника (Programm Counter)

Оператори

Компілятор підтримує ряд операторів які перераховані в таблиці (чим вище становище в таблиці, тим вище пріоритет оператора). Вирази можуть полягати в круглі дужки, такі вирази обчислюються перед виразами за дужками.

пріоритет символ опис
14 ! логічне заперечення
14 ~ побітного заперечення
14 - мінус
13 * множення
13 / розподіл
12 + підсумовування
12 - віднімання
11 << зрушення вліво
11 >> зрушення вправо
10 < Менше ніж
10 <= Менше або дорівнює
10 > Більше ніж
10 > = Більше або дорівнює
9 == Так само
9 ! = Не дорівнює
8 & побітного І
7 ^ Побітного виключає АБО
6 | побітного АБО
5 && логічне І
4 || логічне АБО

логічне заперечення

Символ :!
Опис : Повертає 1 якщо вираз дорівнює 0, і навпаки
Пріоритет : 14
Приклад : ldi r16,! 0xf0; У r16 завантажити 0x00

побітного заперечення

Символ : ~
Опис : Повертає вираз в якому всі біти проінвертірованний
Пріоритет : 14
Приклад : ldi r16, ~ 0xf0; У r16 завантажити 0x0f

мінус

Символ : -
Опис : Повертає арифметичне заперечення вираження
Пріоритет : 14
Приклад : ldi r16, -2; Завантажити -2 (0xfe) в r16

множення

Символ : *
Опис : Повертає результат множення двох виразів
Пріоритет : 13
Приклад : ldi r30, label * 2

розподіл

Символ : /
Опис : Повертає цілу частину результату ділення лівого вираження на праве
Пріоритет : 13
Приклад : ldi r30, label / 2

підсумовування

Символ : +
Опис : Повертає суму двох виразів
Пріоритет : 12
Приклад : ldi r30, c1 + c2

віднімання

Символ : -
Опис : Повертає результат віднімання правого вирази з лівого
Пріоритет : 12
Приклад : ldi r17, c1-c2

зрушення вліво

Символ : <<
Опис : Повертає ліве вираз зрушене вліво на число біт вказане справа
Пріоритет : 11
Приклад : ldi r17, 1 << bitmask; У r17 завантажити 1 зрушену вліво bitmask раз

зрушення вправо

Символ : >>
Опис : Повертає ліве вираз зрушене вправо на число біт вказане справа
Пріоритет : 11
Приклад : ldi r17, c1 >> c2; У r17 завантажити c1 зрушене вправо c2 раз

Менше ніж

Символ : <
Опис : Повертає 1 якщо ліве вираз менше ніж праве (враховується знак), і 0 в іншому випадку
Пріоритет : 10
Приклад : ori r18, bitmask * (c1 <c2) +1

Менше або дорівнює

Символ : <=
Опис : Повертає 1 якщо ліве вираз менше або дорівнює ніж праве (враховується знак), і 0 в іншому випадку
Пріоритет : 10
Приклад : ori r18, bitmask * (c1 <= c2) +1

Більше ніж

Символ :>
Опис : Повертає 1 якщо ліве вираз більше ніж праве (враховується знак), і 0 в іншому випадку
Пріоритет : 10
Приклад : ori r18, bitmask * (c1> c2) +1

Більше або дорівнює

Символ :> =
Опис : Повертає 1 якщо ліве вираз більше або дорівнює ніж праве (враховується знак), і 0 в іншому випадку
Пріоритет : 10
Приклад : ori r18, bitmask * (c1> = c2) +1

Так само

Символ : ==
Опис : Повертає 1 якщо ліве вираз дорівнює правому (враховується знак), і 0 в іншому випадку
Пріоритет : 9
Приклад : andi r19, bitmask * (c1 == c2) +1

Не дорівнює

Символ :! =
Опис : Повертає 1 якщо ліве вираз не дорівнює правому (враховується знак), і 0 в іншому випадку
Пріоритет : 9
Приклад : .SET flag = (c1! = C2); Встановити flag рівним 1 або 0

побітного І

Символ : &
Опис : Повертає результат побітового І виразів
Пріоритет : 8
Приклад : ldi r18, High (c1 & c2)

Побітного виключає АБО

Символ : ^
Опис : Повертає результат побітового виключає АБО виразів
Пріоритет : 7
Приклад : ldi r18, Low (c1 ^ c2)

побітного АБО

Символ : |
Опис : Повертає результат побітового АБО виразів
Пріоритет : 6
Приклад : ldi r18, Low (c1 | c2)

логічне І

Символ : &&
Опис : Повертає 1 якщо обидва вирази не дорівнюють нулю, і 0 в іншому випадку
Пріоритет : 5
Приклад : ldi r18, Low (c1 && c2)

логічне АБО

Символ : ||
Опис : Повертає 1 якщо хоча б один вислів не дорівнює нулю, і 0 в іншому випадку
Пріоритет : 4
Приклад : ldi r18, Low (c1 || c2)

функції

Визначено наступні функції:

  • LOW (вираз) повертає молодший байт вираження
  • HIGH (вираз) повертає другий байт вираження
  • BYTE2 (вираз) то ж що і функція HIGH
  • BYTE3 (вираз) повертає третій байт вираження
  • BYTE4 (вираз) повертає четвертий байт вираження
  • LWRD (вираз) повертає біти 0-15 вираження
  • HWRD (вираз) повертає біти 16-31 вираження
  • PAGE (вираз) повертає біти 16-21 вираження
  • EXP2 (вираз) повертає 2 певною мірою (вираз)
  • LOG2 (вираз) повертає цілу частину log2 (вираз)

Використання програми

Цей розділ описує використання компілятора і вбудованого редактора

відкриття файлів

У WAVRASM можуть бути відкриті як нові так і існуючі файли. Кількість відкритих файлів обмежена розміром пам'яті, однак обсяг одного файлу не може перевищувати 28 кілобайт (в зв'язку з обмеженням MS-Windows). Компіляція файлів більшого розміру можлива, але вони не можуть бути редагуються вбудованим редактором. Кожен файл відкривається в окремому вікні.

Повідомлення про помилки

Після компіляції програми з'являється вікно повідомлень. Всі виявлені компілятором помилки будуть перераховані в цьому вікні. При виборі рядка з повідомленням про помилку, рядок вихідного файлу, в якій знайдена помилка, стає червоною. Якщо ж помилка знаходиться у вкладеному файлі, то цього підсвічування не відбудеться.

Якщо по рядку в вікні повідомлень клацнути двічі, то вікно файлу з вказаною помилкою стає активним, і курсор поміщається на початку рядка містить помилку. Якщо ж файл з помилкою не відкритий (наприклад це вкладений файл) то він автоматично буде відкрито.

Врахуйте, що якщо Ви внесли зміни в вихідні тексти (додали або видалили рядки), то інформація про номери рядків у вікні повідомлень не є коректною.

Опції

Деякі установки програми можуть бути змінені через пункт меню Options. Якщо вибрати цей пункт то з'явиться діалогове вікно.

В поле введення під назвою "List-file extension" вводиться розширення використовується для файлу лістингу, а в поле "Output-file extension" знаходиться розширення для файлів з результатом компіляції програми. В прямокутнику "Output file format" можна вибрати формат вихідного файлу (як правило використовується интеловский). Однак це не впливає на об'єктний файл (який використовується AVR Studio), який завжди має один і той же формат, і розширення OBJ. Якщо у вихідному файлі присутній сегмент EEPROM то буде також створено файл з розширенням EEP. Установки задані в даному вікні запам'ятовуються на постійно, і при наступному запуску програми, їх немає необхідності встановлювати заново.

Опція "Wrap relative jumps" дає можливість "загортати" адреси. Ця опція може бути використана тільки на чіпах з об'ємом програмної пам'яті 4К слів (8К байт), при цьому стає можливим робити відносні переходи (rjmp) і виклики підпрограм (rcall) по всій пам'яті.

Опція "Save before assemble" вказує програмі на необхідність автоматичного збереження активного вікна (і тільки його) перед компіляцією.

Якщо Ви хочете щоб при закритті програми, закривалися всі відкриті вікна, то поставте галочку в поле "Close all windows before exit".


Atmel, AVR є зареєстрованими товарними знаками фірми Atmel Corporation