Директиви за сглобяване

Директиви за контрол на модула

Директивите за контрол на модула се използват за маркиране на началото и края на модулите на изходната програма и за присвояване на имена и типове към тях. Тези директиви са показани в таблица 1.

Таблица 1 - Директиви за контрол на модула

Завършва превода на последния модул във файла.

Завършва превода на текущия модул.

Стартира библиотечен модул

Стартира библиотечен модул

Стартира програмен модул.

Стартира програмен модул.

Декларира атрибутите на модул по време на изпълнение.

БИБЛИОТЕКАсимвол [(expr)]

МОДУЛсимвол [(expr)]

ИМЕсимвол [(израз)]

ПРОГРАМАсимвол [(expr)]

exprнезадължителен параметър, приема стойност от 0 до 255, използвана от iar компилатора за определяне на езика за програмиране, модела на паметта и конфигурацията на процесора.

ключтекстов низ, указващ ключа.

symbolиме на модул, използвано от xlink и xlib.

стойносттекстов низ, указващ стойността.

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

Използва се за стартиране на програмен модул и задаване на име на бъдеща връзка към IAR XLINK Linker™ и IAR XLIB Librarian™. Програмните модули са безусловно свързани с XLINK, дори ако други модули не се отнасят към тях.

Използва се за създаване на библиотеки, съдържащи много малки системи за поддръжка, подобни на модули, за езици от високо ниво - където всеки модул често представлява отделна подпрограма. Чрез използването на многомодулно програмиране можете значително да намалите броя на източниците и необходимите обектни файлове. Модулите на библиотеката се копират само в свързан код, ако други модули препращатобщ символен етикет в модула.

Използва се за определяне на края на модул.

Използва се за указване на края на файл източник. Всички редове след директивата END се игнорират.

Използва се за предписване на последователност между модулите. Всички модули, които са свързани помежду си, трябва да бъдат идентифицирани с един и същ ключ на атрибута или със специалната стойност *. Използването на специалната стойност * е еквивалентно на това, че атрибутите изобщо не са дефинирани. Може да е полезно да се посочи изрично, че модулът може да обработва всеки модел по време на изпълнение. Атрибутите на модела на компилатора започват с двойно подчертаване. За да се избегне объркване, този стил не трябва да се използва в дефинирани от потребителя атрибути на асемблер.

Следният пример дефинира три модула, където:

MOD_1 и MOD_2не могатда бъдат свързани заедно, тъй като имат различни стойности за модел"foo"

MOD_1 и MOD_3могатда бъдат свързани заедно, тъй като имат една и съща дефиниция на модел"bar"и няма конфликт в дефиницията"foo".

MOD_2 и MOD_3могатда бъдат свързани заедно, тъй като нямат конфликти на модели. Стойността"*"съответства на всяка стойност на модела.

RTMODEL "лента", "XXX"

RTMODEL "лента", "XXX"

Указания за управление на символни дефиниции (променливи)

Тези директиви контролират символни дефиниции между модулите. Тези директиви са показани в таблица 2.

Таблица 2 - Директиви за управление на символни дефиниции

Импортира външна символна дефиниция.

Експортира символни дефиниции към други модули

Експортира символни дефиниции към други модули. Позволява множество дефиниции.

Форсиранесимволично определение, което трябва да се спомене.

Синтаксис: EXTERNсимвол[:SADDR] [,символ[:SADDR]] ...

Където:symbolе символната дефиниция за експортиране/импортиране

Описание на директиви за управление на символни дефиниции.

Използва се, за да направи една или повече символни дефиниции достъпни за други модули. На символни дефиниции (променливи), декларирани като PUBLIC, могат да се присвояват само стойности (константи). В този случай, когато пишете програмния код, можете да използвате тези променливи. Символните дефиниции, декларирани с директивата PUBLIC, могат да бъдат променливи или абсолютни и могат също да се използват в изрази (със същите правила като за други символни дефиниции). Директивата винаги експортира пълни 32-битови стойности, което прави възможно използването на глобални 32-битови константи и в асемблери и за 16 и 8-битови процесори. Използване на операторите LOW, HIGH, >> и ,

Начало на абсолютен сегмент

Начало на именуван абсолютен сегмент

Начало на общия сегмент

Начало на сегмента за преместване

Начало на сегмент от стека

Синтаксис: ALIGNподравняване[,стойност]

сегмент- символно име на сегмента.

type- тип памет (UNTYPED, CODE или DATA)

стойност- Стойност на байта, използвана за подпълване, стойността по подразбиране е нула.

address– Адресът, на който ще бъде поставен сегментът

флаг –може да има следните параметри:

Тази част от сегмента може да бъде отхвърлена от линкера, дори ако в тази част от такта не са споменати символни дефиниции. Обикновено всички части на сегмент (с изключение на кода за стартиране ипрекъсващи вектори) трябва да зададе този флаг. Режимът по подразбиране е ROOT, което показва, че част от сегмента не трябва да се изхвърля.

Позволява на линкера да пренарежда сегментни части. За даден сегмент всички части на сегмента трябва да указват едно и също състояние за този флаг. NOREORDER - показва, че всички части на сегмента трябва да останат на мястото си

Линкерът сортира частите на сегмента в низходящ ред на подравняване. За даден дял всички части на дяла трябва да указват едно и също състояние за този флаг. NOSORT - показва, че частите не трябва да бъдат сортирани (по подразбиране)

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

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

Следващият пример преобразува командите за въвеждане на подпрограма за прекъсване в съответните вектори за прекъсване, използвайки абсолютен сегмент.

DC16 основен ; RESET_vect

int0 DC16 intnmi

int1 DC16 intwdt

int2 DC16 intp0

int3 DC16 intp1

основна MOVW AX, [SP+2] ; начален код

Началото на преместен сегмент:

В следващия пример данните след първата директива RSEG се поставят в плаващ сегмент, наречен таблица; Директивата ORG се използва за създаване на празнина от шест байта в таблица. Кодът след втората директива RSEG се поставя в преместваем сегмент, наречен код

Начало на сегмент от стека:

Следващият пример дефинира два 100-байтови стека в преместваем сегмент, наречен rpnstack

Начало на общия сегмент:

Следният пример дефинира два общи сегмента, съдържащи променливи:

Тъй като споделените сегменти имат едни и същи данни за име, променливите нагоре и надолу се отнасят до същите места в паметта като първия и последния байт на 4-байтовата променлива за броене.

RSEG данни; Стартиране на плаващ сегмент от данни

цел DC16 1 ; Целта е на равна граница

ПОДРАВНЯВАНЕ 6 ; Нулева подложка, до 64-байтова граница

резултати DS8 64 ; Създаване на 64-байтова таблица

ALIGNRAM 3; Подравняване към 8-байтова граница

възраст DS8 64 ; Създаване на друга 64-байтова таблица

Използване на директивата SADR

Следващият пример показва как декларираният етикет 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. ДРУГО. ENDIF могат да имат многостепенно влагане.

Следният макрос добавя константа към регистър:

Ако b макро аргументът е 1, тогава инструкцията INC се изпълнява, за да запише циклите на брояча; в противен случай се изпълнява командата ADD.

Това може да се провери със следната програма:

Тези директиви ви позволяват да създавате персонализирани макро дефиниции (макро команди). Директивите са показани в таблица 5.

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

Задава броя на аргументите за макроса.

Край на преструктурирането

Преждевременно излизане от макрос

Създава локални макро променливи.

Дефинира макрос (старт на макрос)

Събира инструкции определен брой пъти.

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

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

REPTIформално,действително[,действително] ...

където:actualе низът, който трябва да бъде заменен.

аргументе името на символния аргумент.

formal -параметър, който се заменя сactual

име –име на макрос

символ– локална макропроменлива

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

Макросът е дефиниран от потребителя символен израз, който представлява блок от един или повече редове от изходния код на асемблер. След като сте дефинирали макрос, можете да го използвате във вашата програма като директива за асемблер или мнемонична инструкция за асемблер.

Когато асемблерът срещне макрос, той търси дефиницията на макроса и вмъква редовете, които макросът представлява, сякаш са включени в изходния код на позицията, където се извиква макросът.

Макросът всъщност изпълнява простзамяна на текст и можете да контролирате какво заменят, като промените настройките им.

Тукmacronameе името, което ще използвате за макроса, аargе аргументът за аргумента, който искате да предадете на макроса, когато макросът бъде разгънат.

Например, можете да дефинирате макроса ГРЕШКА, както следва:

errmac МАКРО текст

Този макрос използва текстовия параметър, за да настрои съобщението за грешка за рутинната процедура за прекъсване. Бихте извикали макроса с израз като:

errmac „Дискът не е готов“

По този начин можете да изведете съобщение за грешка просто като извикате макрос с описание на текста на грешката. Асемблерът превежда това като:

DC8 „Дискът не е готов“, 0

Използва се за преждевременно излизане от макрос.

EXITM не може да бъде вътре в REPT блокове. ENDR, REPTC .. .ENDR или REPTI .. .ENDR.

Използва се за създаване на макро локални променливи. Директивата LOCAL трябва да се използва преди да се използва променлива. Всеки път, когато макрос се разширява, трябва да се създават нови локални променливи с директивата LOCAL. Следователно трябва да използвате локални променливи в рекурсивен макрос.

Символът _args задава броя на аргументите, предадени на макроса. Следният пример показва как може да се използва _args: