Директиви асемблера. Директиви визначення даних. LISTMAC – Включити розгортання макросів у лістингу

Мітки
Мітка в мові асемблера може містити такі символи:


Літери: від A до Z та від a до z
Цифри: від 0 до 9
Спецсимволи: знак питання (?)
точка (.) (тільки перший символ)
знак "комерційне ет" (@)
підкреслення (_)
долар ($)

Першим символом у мітці має бути буква або спецсимвол. Цифра може бути першим символом мітки, а символи $ і? іноді мають спеціальні значення та зазвичай не рекомендуються до використання. Великі та маленькі літери за замовчуванням не розрізняються, але відмінність можна включити, задавши ту чи іншу опцію командному рядкуасемблера. Максимальна довжинаетикетці - 31 символ. Приклади тегів: COUNT, PAGE25, $E10. Рекомендується використовувати описові та смислові мітки. Імена регістрів, наприклад, AX, DI або AL є зарезервованими та використовуються лише для вказівки відповідних регістрів.
Якщо мітка розташовується перед командою процесора, відразу після неї завжди ставиться символ «:» (двокрапка), який вказує асемблеру, що треба створити змінну з цим ім'ям, що містить адресу поточної команди:
some_loop:

loopne some_loop
Коли мітка стоїть перед директивою асемблера, вона зазвичай виявляється одним із операндів цієї директиви і двокрапка не ставиться:

codesg segment
lodsw; рахувати слово з рядка,
cmp ax,7; якщо це 7 - вийти з циклу
codesg ends
Розглянемо директиви, що працюють безпосередньо з мітками та їх значеннями: LABEL, EQU та =.

Директива LABEL

Мітка label тип Директива LABEL визначає мітку та задає її тип. Тип може бути одним з: BYTE (байт), WORD (слово), DWORD (подвійне слово), FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближня мітка), FAR (дальня мітка) ). Мітка отримує значення, що дорівнює адресі наступної команди або таких даних, і тип, вказаний явно. Залежно від типу команда
mov мітка,0 запише на згадку про байт (слово, подвійне слово і т.д.), заповнений нулями, а команда
call мітка здійснить ближній або дальній виклик підпрограми.

За допомогою директиви LABEL зручно організовувати доступ до тих самих даних, як до байтів, так і до слів, визначивши перед даними дві мітки з різними типами.

Директива EQU

Директива EQU надає мітці значення, що визначається як результат цілісного виразу у правій частині. Результатом цього виразу може бути ціле число, адреса або будь-який рядок символів:
equ вираз

truth equ 1
message1 equ "Try again$"
var2 equ 4
cmp ax, truth; cmp ax,1
db message1; db "Try again$"
mov ax, var2; mov ax, 4 Директива EQU найчастіше використовується для введення параметрів, загальних для всієї програми, аналогічно команді #define препроцесора мови С.

Директива =

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

Кожен асемблер пропонує цілий набір спеціальних визначених міток - це може бути Поточна дата(@date або??date), тип процесора (@cpu) або ім'я того чи іншого сегмента програми, але єдина зумовлена ​​мітка, що підтримується всіма асемблерами, що розглядаються нами, - $ . Вона завжди відповідає поточній адресі. Наприклад, команда

Jmp $

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

Щоб краще зрозуміти цю справу я написав маленьку програму. Все той же “Hello World”, але на новий лад:) Текст нижче:

Програ ассемблируется TASM і MASM, але EXE файлик, асемблированный MASM однією байт більше. Помічаємо, що команду mov dx,offset msg, замінили на команду lea dx,msgb. LEA поміщає адресу зміщення зазначених даних DX, тобто. робить те ж саме, що і команда mov з offset. Рекомендую це подивитись під відладчиком.



Дивимося уважно лістинги асемблювання та знаходимо різницю.



Цікаво, що TASM асемблював команду LEA в даному випадкуяк команду MOV (код операції BA), а MASM асемблював команду LEA в інший код операції - 8D16, що збільшило розмір програми на 1 байт. Чому він вирішив так зробити, поки не знаю, але цікаво було б з'ясувати.

Асемблери MASM, TASM та WASM відрізняються між собою. Однак створення простих програм для них практично не має відмінностей, за винятком самого асемблювання та компонування.

Отже, наша перша програма для MASM, TASM та WASM, яка виводить англійську букву"A" в поточній позиції курсору, тобто в лівому верхньому куткуекрану:

Model tiny .code ORG 100h start: MOV AH,2 MOV DL,41h INT 21h INT 20h END start Цей текст можна набрати в будь-якому простому текстовому редакторі– наприклад, у БЛОКНОТІ (NotePad) від WINDOWS (але не в Word і не в іншому «навороченому»). Однак я рекомендую «просунутий» текстовий редактор із підсвічуванням синтаксису, наприклад, PSPad (див. розділ ). Потім зберігаємо цей файл із розширенням.asm, наприклад, у папці MYPROG. Назвемо файл atest. Отже, ми отримали: C:\MYPROG\atest.asm.

ПРИМІТКА
Зверніть увагу, що у першій команді ми записали 2 замість 02h. MASM, TASM та WASM, як і Emu8086, допускають такі «вільності». Хоча можна написати 02h – помилок не буде.

Пояснення до програми:

.model tiny- Перший рядок. Директива.model визначає модель пам'яті конкретного типу файлів. У нашому випадку це файл з розширенням COMТому вибираємо модель tiny, в якій об'єднані сегменти коду, даних, і стека. Модель tiny призначена для створення файлів типу СОМ.

.code- Другий рядок. Ця директива починає сегмент коду.

ORG 100h- третій рядок. Ця команда встановлює значення програмного лічильника в 100h, тому що при завантаженні СОМ-файлу на згадку, DOS виділяє під блок даних PSP перші 256 байт ( десяткове число 256 і шістнадцятковому 100h). Код програми розміщується лише після цього блоку. Усі програми, які компілюються у файли типу СОМ, повинні починатися з цієї директиви.

start: MOV AH, 02h- 4-й рядок. Мітка start розташовується перед першою командою в програмі і використовуватиметься в директиві END, щоб вказати, з якої команди починається програма. Інструкція MOV поміщає значення другого операнда першого операнд. Тобто значення 02h міститься в регістр АН. Навіщо це робиться? 02h - це функція ДОСа, яка виводить символ на екран. Ми пишемо програму для DOS, тому використовуємо команди цієї операційної системи(ОС). А записуємо ми цю функцію (а точніше її номер) саме в регістр АН, тому що переривання 21h використовує саме цей регістр.

MOV DL, 41h- 5-й рядок. Код символу "A" заноситься в регістр DL. Код символу A за стандартом ASCII – це число 41h.

INT 21h- 6-й рядок. Це і є те саме переривання 21h – команда, що викликає системну функцію DOS, задану в регістрі АН (у прикладі це функція 02h). Команда INT 21h – основний засіб взаємодії програм із ОС.

INT 20h- 7-й рядок. Це переривання, яке повідомляє операційну систему про вихід із програми, і про передачу управління консольному додатку. У тому випадку, якщо програма вже відкомпільована та запущена з ОС, команда INT 20h поверне нас до ОС (наприклад, до DOS).

END start- 8-й рядок. Директива END завершує програму, одночасно вказуючи, з якої позначки має починатися її виконання.

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

Сегмент програми відкривається директивою CSEG. Якщо програма починається з цього сегмента, директива може бути відсутня. У сегменті програми за допомогою директиви ORG можна вказати початок сегмента.

Директива.DB в сегменті визначає один байт або групу байтів, констант, що записуються у Flash-пам'ять. Директива DW визначає слово або групу слів, що записуються в пам'ять як констант. Початок запису констант визначається міткою, що стоїть перед відповідною директивою. Перераховані константи поділяються комами.

Директива.DEF надає регістру символічне ім'я. Директиви .EQU, .SET надають значення імені. Ім'я, якому присвоєно значення директивою. EQU, не може бути переназначено, і значення не може бути змінено. Ім'я, надане директивою.SET, може бути змінене іншою директивою.SET.

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

Директива INCLUDE з ім'ям файлу використовується для включення в текст програми іншого файлу.

Таблиця 1.8. Список директив

Директива

Опис

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

Сегмент програми

Визначити байт - константу у Flash-пам'яті або

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

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

програма

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

Визначає слово у Flash-пам'яті або EEPROM

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

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

Сегмент EEPROM

Вихід із файлу

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

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

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

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

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

Встановити становище у сегменті

Встановити для змінної еквівалентний вираз

Директиви.MACRO та.ENDMACRO обрамляють макровизначення. Макровизначення може мати до 10 параметрів з фіксованими іменами@ 0, ..., @ 9. При виклику макровизначення параметри задають у вигляді списку у порядку нумерації.

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

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

Директиви .LIST, .NOLIST, .LISTMAC використовують для керування виведенням лістингу.

Директиви є команди управління компілятором. Оголошення кожної з них має розпочинатися з точки. Практика показує, що у будь-якому асемблері найінтенсивніше використовується лише близько 10…20 директив. Всі інші або є обов'язковими, або відповідають за управління, лише незначними властивостями компілятора. До "основним", характерним і для асемблерів інших процесорів, відносяться директиви .equ, .org, .def, .сseg, .dseg і т.д. Ну а такі директиви, як .dq, .exit, .listmac в реальних програмахзустрічаються справді дуже рідко. Нижче наведено перелік, опис та приклади використання директив фірмового асемблера мікроконтролерів AVR.

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

Директива.
Синтаксис написання:
.include "(шлях до файлу)"
Приклад використання:

Include "m8def.inc" ;вставка стандартного файлу заголовка

Директива.exit вказує асемблеру місце закінчення файлу вихідного тексту. Усі оператори після директиви стають невидимими для компілятора. Якщо .exit зустрічається в файлі, що підключається, то збірка проекту закінчується рядком, де розташована директива.include. У разі відсутності директиви.exit, кінцевою точкою збирання вважається останній рядоквихідний текст.

Директива.
Синтаксис написання:
.exit
Приклад використання:

Exit ;кінець файлу

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

Директиви.
Синтаксис написання:
.nolist, .list
Приклад використання:

Nolist ;заборонити виведення тексту файлу “m8def.inc” .include "m8def.inc" ;у файл листингу програми.list ;продовжити виведення інформації

Директива.equ надає символьному імені деяке числове значення. Символьне ім'я має бути унікальним і не може бути змінено у процесі написання програми. Директива не може застосовуватися для призначення символьних імен регістрам загального призначення.

Директива.equ
Синтаксис написання:
.equ (символьне ім'я) = (вираз)
Приклад використання:

Equ DDRB = 0x17 ;присвоєння імені DDRB значення 0x17 .equ PORTB = DDRB + 1 ;присвоєння імені PORTB значення 0x18

Директива.set справляє те саме дію, що и.equ. Але на відміну від останньої символьне ім'я може бути перевизначено в будь-якому місці програми.

Директива.
Синтаксис написання:
.set (символьне ім'я) = (вираз)
Приклад використання:

Set OFFSET = 0x100; присвоєння імені OFFSET значення 0x100. .set OFFSET = OFFSET + 1 ;перевизначення значення OFFSET

Директива.def надає символьне ім'я одному з регістрів загального призначення. Надалі ході програми це ім'яможе бути скасовано директивою.

Директиви.def, .undef
Синтаксис написання:
.def (символьне ім'я) = (реєстр)
.undef (символьне ім'я)
Приклад використання:

Def temp = R16 ;присвоєння регістру R16 ім'я temp .undef temp ;скасування подальшого використання імені temp

Директиви .db, .dw, .dd, .dq призначені для резервування пам'яті мікроконтролера під ініціалізовані дані. Усі вони можуть застосовуватися лише в сегментах коду та EEPROM-пам'яті. Різниця між цими директивами полягає в розрядності даних. Директива.db резервує байти, .dw – слова, .dd – подвійні слова. У поодиноких випадках може виявитися зручним використання директиви.dq, що резервує 64-розрядні дані.

Директиви .db, .dw, .dd, .dq
Синтаксис написання:
(мітка): .db (8-розрядні дані)
(мітка): .dw (16-розрядні дані)
(мітка): .dd (32-розрядні дані)
(мітка): .dq (64-розрядні дані)
Приклад використання:

Label: .db 0xFA, 250, -6, 0b11111010. 077149609196178927, -521103510453211

Директива.byte резервує пам'ять під неініціалізовані дані у сегментах SRAM та EEPROM.

Директива.byte
Синтаксис написання:
(мітка): .byte (кількість даних, що резервуються)
Приклад використання:

Equ PAGESIZE = 0x20 buffer: . byte 2*PAGESIZE ;резервування 64 байт у SRAM

Директиви .dseg, .eseg, .cseg визначають початок сегментів даних, EEPROM-пам'яті та коду відповідно. У вихідному файлі кожен із сегментів може бути представлений лише в одному екземплярі. Якщо всі ці директиви відсутні в програмі, компілятор за умовчанням вважає, що всі оператори розташовані в секції коду.

Директиви.dseg, .eseg, .cseg
Синтаксис написання:
.dseg
.eseg
.cseg
Приклад використання:

Dseg ;початок сегмента даних buffer: . byte 32; резервування 32 байт під буфер в SRAM. cseg; початок сегмента коду rjmp initial. string: .db "ATmega8", 0; рядок, що зберігається у FLASH-пам'яті. = 0xAA

Директива.org дозволяє встановити компілятор початкову адресу в межах сегментів коду, даних та EEPROM-пам'яті. У разі застосування в сегменті коду директива визначає адресу розміщення 16-розрядного слова програм.

Директива.org
Синтаксис написання:
.org (початкова адреса)
Приклад використання:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;початок сегмента даних.org SRAM_START ;резервування 32 байт у SRAM під буфер, buffer: . byte 32 ;починаючи з адреси 0x60 .cseg ;початок сегмента коду.org 0 ;вектор скидання за адресою 0 rjmp initial . .org 0x50 ;початок основної програми з адреси 0x50 initial: ldi temp,high(RAMEND) ;ініціалізація стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp .

Директиви .macro, .endmacro (.endm), що визначають початок та кінець макросу відповідно.

Директиви.macro, .endmacro (.endm)
Синтаксис написання:
.macro (ім'я макросу)
Приклад використання:

Macro set_bit ; оголошення макросу установки біта порту sbi @ 0, @ 1; встановити біт @ 1 регістра порту @ 0 sbi @ 0-1, @ 1; настроїти на виведення лінію @ 1 регістра DDRx. Endm. set_bit PORTB,0; встановити на лінії 0 порту B лог.1

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

Директива.
Синтаксис написання:
.listmac
Приклад використання:

Listmac ;дозволити розгортати текст макросів у файлі лістингу

Директиви.message, .warning, .error призначені для виведення у вікно збирання проекту додаткової інформаціїпро хід компіляції програми. Директива.message генерує повідомлення для рядка, в якому було зустрінуто її виклик. Застосування.warning призводить до попередження, а.error – до повідомлення про помилку. В останньому випадку збирання проекту припиняється.

Директиви.message, .warning, .error
Синтаксис написання:
.message "(текст повідомлення)"
.warning "(текст попередження)"
.error "(текст повідомлення про помилку)"
Приклад використання:

Message "Macros має бути названий тут." .warning "Too high frequency!" .error "Wrong macro argument!"

Група директив умовної компіляції .ifdef, .ifndef, .if, .else, elif, .endif використовуються для вставок програмного кодузалежно від різних умов. Директива.ifdef перевіряють наявність оголошення певного символьного імені. За директивою може йти набір команд, які будуть підставлені в текст, якщо умова перевірки “істина” (ім'я було оголошено). Директива.ifndef протилежна.ifdef перевіряє відсутність оголошення символьного імені. Директива.if здійснює підстановку коду, коли виконується умова порівняння, зазначена як її параметр. Команди, які повинні виконуватися, якщо умова директиви.if "хибно" - розташовуються після директиви.else. Розгалуження типу "якщо" - "то" може мати кілька рівнів вкладення завдяки директиві. elif. Кожен блок перевірки, що починається з .ifdef, .ifndef, .if, має бути закритий директивою .endif.

Директиви if, .ifdef, .ifndef, .else, elif, .endif
Синтаксис написання:
.ifdef (символ) (або.ifndef (символ))
.if (умова)
.else (вираз) (або.elif (умова))
.endif
Приклад використання:

Macro del_ms ;макрос, що формує затримку часу в мс.ifndef FREQ ;якщо не оголошено константу FREQ (частота в Гц), .warning "Undefined FREQ constan!" ;видаємо попередження и.equ FREQ = 1000000 ;присвоюємо за замовчуванням значення 1 МГц.endif .equ DELAY = (@0*FREQ)/4000 ;величина завдання затримки часу.if DELAY > 65535 ;якщо DELAY розміром, якщо DELAY розміром, то. error “Integer overflow in DELAY!” ;реалізація макросу не можлива. pop XL; відновлюємо з стека робочі регістри XH, XL. Endif. Endm. .equ FREQ = 2000000; оголошення тактової частоти 2 МГц. del_ms 25; формування затримки часу в 25 мс

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

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

результаті обчислення має давати результат у цьому діапазоні, інакше число усікається до байта, причому БЕЗ видачі попереджень.

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

число параметрів непарно, то останній вираз буде усічено до байта і записано як слово зі старшим байтом рівним нулю, навіть якщо далі йде ще одна

директиви DB.

Синтаксис:
Мітка: .DB список_виразів

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

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

в результаті обчислення має давати результат у цьому ж діапазоні, інакше число усікається до слова, причому БЕЗ видачі попереджень.

Синтаксис:
Мітка: .DW expressionlist

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

Синтаксис:
.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 зазвичай складається тільки з директив

href="#DW - Define constant word(s) in program memory and EEPROM">DW

та міток. Сегменти EEPROM мають свої власні

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

змінних у необхідному місці EEPROM. Директива не має параметрів.

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

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

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

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

Зустрівши директиву EXITкомпілятор припиняє компіляцію даного файлу. Якщо директива використана у вкладеному файлі (див. директиву

href="#INCLUDE - Include another file">INCLUDE

), то компіляція продовжується з рядка наступного після директиви INCLUDE.

Якщо файл не є вкладеним, то компіляція припиняється.

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

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

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

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

href="#EXIT - Exit this file">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 вказує компілятор на необхідність створення лістингу. Лістинг є комбінацією асемблерного коду, адрес і кодів операцій. за

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

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

Приклад:

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

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

параметри.

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

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

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

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

З директиви MACRO починається визначення макросу. Як параметр директиви передається ім'я макросу. При зустрічі імені макросу пізніше у тексті програми,

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

через коми. Визначення макросу закінчується директивою.

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

Синтаксис:
.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 вказує компілятор на необхідність припинення генерації лістингу. Лістинг являє собою комбінацію асемблерного коду, адрес і

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

спільно з директивою для одержання лістингів окремих частин

вихідних файлів

Синтаксис:
.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 надає імені певне значення. Це ім'я пізніше може бути використане у виразах. Причому на відміну від директиви

href="#EQU - Set a symbol equal to an expression">EQU

значення імені може бути змінено іншою директивою SET.

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

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

CSEG; Початок кодового сегмента
clr r2; Очистити регістр 2