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

Директиви управління модулями

Директиви управління модулями використовуються щоб відзначити початок і кінець модулів вихідної програми, і для того, щоб призначити імена та типи до них. Ці директиви наведені у таблиці 1.

Таблиця 1 – Директиви управління модулями

Закінчує трансляцію останнього модуля у файлі.

Закінчує трансляцію поточного модуля.

Починає бібліотечний модуль

Починає бібліотечний модуль

Починає модуль програми.

Починає модуль програми.

Оголошує атрибути модуля під час виконання.

LIBRARYsymbol [(expr)]

MODULEsymbol [(expr)]

NAMEsymbol [(expr)]

PROGRAMsymbol [(expr)]

exprнеобов'язковий параметр, що приймає значення від 0 до 255, використовується компілятором iar для визначення мови програмування, моделі пам'яті та конфігурації процесора.

keyтекстовий рядок, що визначає ключ.

symbolім'я модуля, використовується xlink та xlib.

valueтекстовий рядок, що визначає значення.

Опис директивуправління модулями

Використовується, щоб розпочати модуль програми та призначати ім'я для майбутнього посилання для IAR XLINK Linker™ та IAR XLIB Librarian™. Модулі програми беззастережно пов'язані XLINK навіть якщо інші модулі не посилаються на них.

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

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

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

Використовується для визначення послідовності між модулями. Усі модулі, які пов'язані разом, повинні бути визначені однаковими ключами атрибутів , або спеціальним значенням *. Використання спеціального значення еквівалентно, що атрибути невизначені взагалі. Буває корисно заявити, що модуль може обробити будь-яку модель під час виконання. Атрибути моделі компілятора починаються з подвійного підкреслення. Щоб уникнути безладдя, цей стиль не повинен використовуватися в атрибутах асемблера, що визначаються користувачем.

Наступний приклад визначає три модулі, де:

MOD_1 і MOD_2не можутьбути зв'язані разом, так як вони мають різні значення для моделі"foo"

MOD_1 і MOD_3можутьбути пов'язані разом, оскільки вони мають однакове визначення моделі"bar"і жодного конфлікту у визначенні"foo".

MOD_2 і MOD_3можутьбути пов'язані разом, оскільки вони мають ніяких модельних конфліктів . Значення"*"відповідає будь-якому модельному значенню.

RTMODEL "bar", "XXX"

RTMODEL "bar", "XXX"

Директиви управління символічними визначеннями (змінними)

Ці директиви керують символічними визначеннями між модулями. Ці директиви наведені у таблиці 2.

Таблиця 2 – Директиви управління символічними визначеннями

Імпортує зовнішнє символічне визначення.

Експортує символічні визначення іншим модулям

Експортує символічні визначення іншим модулям. Дозволяє багаторазові визначення.

Вимушуєсимволічне визначення бути згаданим.

Синтаксис: EXTERNsymbol[:SADDR] [,symbol[:SADDR]] …

Де:symbol– символічне визначення, яке необхідно експортувати/імпортувати

Опис директив управління символічними визначеннями.

Використовується для того, щоб зробити один або більше символічних визначень доступними іншим модулям. Символічним визначенням (змінним), оголошеним як PUBLIC, можуть бути присвоєні тільки значення (константи). При цьому при написанні коду програми можна використовувати ці змінні. Символічні визначення оголошеним директивою PUBLIC можуть бути зміненими або абсолютними, і можуть також використовуватися у виразах (з тими самими правилами, що і для інших символічних визначень). Директива завжди експортує повні 32-бітові значення, що робить доступним використання глобальних 32-розрядних констант також в асемблерах і для 16 і 8 – розрядних процесорів. За допомогою операторів LOW, HIGH, >>, and ,

Початок абсолютного сегменту

Початок названого абсолютного сегменту

Початок загального сегменту

Початок сегмента, що переміщується

Початок сегменту стеку

Синтаксис: ALIGNalign[,value]

segment- символічне ім'я сегмента.

type- тип пам'яті (UNTYPED, CODE або DATA)

value- Значення байта, яке використовується для доповнення, значення за замовчуванням є нульовим.

address– Адреса, куди буде розміщено сегмент

flag –може мати такі параметри:

Ця частина сегмента може бути відкинута компонувальником, навіть якщо жодні символічні визначення у цій частині частки не згадані. Зазвичай всі частини сегмента (крім коду запуску тавекторів переривання) повинні встановити цей прапор. Заданий за замовчуванням режим - ROOT, вказує, що частина сегмента не повинна бути відкинута.

Дозволяє компонувальнику переупорядковувати частини сегмента. Для даного сегмента, всі частини сегмента повинні визначити те саме стан цього прапорця. NOREORDER – вказує, що всі частини сегменту мають залишатися на своїх місцях

Компонувальник сортує частини сегмента в порядку вирівнювання, що зменшується. Для цієї частки, всі частини частки повинні визначити те саме стан для цього прапорця. NOSORT – вказує, що частини не потрібно сортувати (за умовчанням)

Опис директив управління сегментами

Початок абсолютного сегмента:

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

DC16 main; RESET_vect

int0 DC16 intnmi

int1 DC16 intwdt

int2 DC16 intp0

int3 DC16 intp1

main MOVW AX,[SP+2] ; Start of code

Початок сегмента, що переміщається:

У наступному прикладі, дані після першої директиви RSEG поміщені в сегмент, що переміщується названий table; Директива ORG використовується для створення проміжку шести байтів у таблиці. Код, після другої директиви RSEG поміщений в сегмент, що переміщується, названий code

Початок стекового сегмента:

Наступний приклад визначає два 100-байтових стека в сегменті, що переміщується, названим rpnstack

Початок загального сегмента:

Наступний приклад визначає два загальні сегменти, що містять змінні:

Оскільки загальні сегменти мають однакові імена , data, змінні up і down відносяться до одних і тих самих місць у пам'яті як перші та останні байти 4-х байтової змінної count.

RSEG data; Запуск сегмента, що переміщується

target DC16 1; Мета знаходиться на парному кордоні

ALIGN 6; Заповнення нулями, до 64-байтного кордону

результатів DS8 64 ; Створення 64-байтової таблиці

ALIGNRAM 3; Вирівнювання до 8-ми байтового кордону

ages DS8 64; Створення іншої 64-байтової таблиці

Використання директиви SADDR

Наступний приклад демонструє, як оголошена мітка sad1, відноситься до SADDR області:

Умовні директиви трансляції

Ці директиви забезпечують логічний контроль за вибірковою трансляцією вихідного тексту. Директиви наведено у таблиці 4.

Таблиця 4 - Умовні директиви трансляції

Транслює команди, якщо умова є хибною.

Визначає нову умову для блоку IF … ENDIF

Закінчує IF – блок

Транслює команди, якщо умова є істинною.

Де: параметрconditionприймає одне з наступних значень:

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

Опис умовних директив трансляції

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

Директива ELSEIF використовується для введення нової умови після директиви IF. Умовні директиви асемблера можуть використовуватися хоч десь у коді.

Усі директиви асемблера (крім END) можуть бути заблоковані умовними директивами.

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

Наступна макрокоманда додає константу в регістр:

Якщо аргумент b макрокоманди дорівнює 1, то виконується команда INC для збереження циклів лічильника; інакше виконується команда ADD.

Це може бути перевірено наступною програмою:

Ці директиви дозволяють створювати користувацькі макровизначення (макрокоманди). Директиви наведено у таблиці 5.

Таблиця 5 - Директиви макрообробки

Встановлює кількість аргументів для макросу.

Кінець повторної структури

Передчасний вихід із макросу

Створює локальні змінні макросу.

Визначає макрос (початок макросу)

Збирає інструкції вказану кількість разів.

Повторення та характеристики символів.

Повторення та характеристики рядків.

REPTIformal,actual[,actual] …

де:actual- рядок, який буде замінено.

argument– ім'я символічного аргументу.

formal –параметр, який замінюєтьсяactual

name –ім'я макрокоманди

symbol– локальна змінна макрокоманди

Опис директив макрообробки

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

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

Макрос фактично виконує простутекстову заміну, і Ви можете керувати тим, що вони замінюють, змінюючи їх параметри.

Тутmacroname- ім'я, яке Ви збираєтеся використовувати для макрокоманди, іarg- параметр для аргументу, який Ви хочете передати макрокоманді, коли макрокоманда розширена.

Наприклад, можна визначити макрокоманду ERROR наступним чином:

errmac MACRO text

Ця макрокоманда використовує параметр text, щоб встановити повідомлення про помилки для підпрограми abort. Ви б викликали макрокоманду інструкцією типу:

errmac 'Disk no ready'

Таким чином, можна виводити повідомлення про помилки, просто викликаючи макрокоманду з описом тексту помилки. Асемблер транслює це як:

DC8 'Disk not ready',0

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

EXITM не може знаходитися всередині блоків REPT. ENDR, REPTC .. .ENDR, або REPTI .. .ENDR.

Використовується для створення локальних змінних макрокоманди. Директива LOCAL повинна використовуватися до використання змінної. Щоразу, коли макрокоманда розширено, нові локальні змінні мають бути створені директивою LOCAL . Тому слід використовувати локальні змінні в рекурсивному макросі.

Символ _args визначає кількість аргументів, що пройшли до макрокоманди. Наступний приклад показує, як можна використовувати _args :