Макроси на асемблер
При програмиране достатъчно сериозен проблем, има повтарящи се части от код. Те могат да бъдат малки, и може да взема заеми и изобилие от пространство. В последния случай, тези фрагменти значително ще затруднят програма текст за четене, и за да се намали видимостта усложнява отстраняване на грешки и да служат като неизчерпаем източник на грешка. В асемблер има няколко инструмента, които решават дублирането на кодови секции проблем. Те включват:
- макро асемблер;
- процедури механизма;
- Прекъсване механизъм.
Макрос е низ, съдържащ символично име - името на макроса. предназначена да бъде заместен с един или повече други редове. Макро име може да бъде придружен с опции. За да напишете макроси, първо трябва да определят своя шаблон-описание, наречена макроси.
Синтаксисът на макроса е следното:
ImyaMakrokomandy макро SpisokFormalnyhArgumentov
TeloMakroopredeleniya
endm
Macro се обработва от преводача следва. За да използвате макроса е описано на точното място в програмата, трябва да се активира с помощта на макро, показващи следния синтаксис:
В резултат на прилагането на синтактична конструкция в програмата източник е замяната му струни на TeloMakroopredeleniya структура. Но това не е обикновена подмяна. Обикновено макроса съдържа списък с аргументи - SpisokFakticheskihArgumentov. която е коригирана макроси. Поставете в тялото на макроса, който ще бъде заменен от действителния аргумент на макроикономическите условия, определени от така наречените формални аргументи. По този начин, в резултат на макро програма формални аргументи макроси се заместват със съответните реални аргументи; Това е контекстът на счетоводство. Този процес се нарича заместване macrogenerations. и в резултат на този процес е макро експанзия.
Макроси на асемблер, подобен на #define директива в C език.
Има три макро разположение:
- в началото на изходния код на програмата, до код и данни, с цел да не се намаляват надеждността на програмата. Тази опция трябва да се използва в случаите, когато определени макроси са от значение само в рамките на един на програмата;
- в отделен файл. Тази опция е подходяща, когато се работи по няколко програми, една от областите на безпокойство. За да предоставите тези макроси в дадена програма, е необходимо в началото на изходния код на програмата за запис на директива включва името на файла. например:
586
. модел плоски, stdcall
включва show.inc; тук да се вкара в show.inc на текстов файл
включва iomac.inc
очисти outstr, exitV този случай, текстът източник на програмата, преди предаването MASM вместо включва iomac.inc низ вмъква низ от iomac.inc файл. Но добавя текстът ще бъде различен от оригинала, така че тя ще бъде не макро outstr и излизане.
Всеки действителния аргумент е поредица от букви, за да се образува, които се прилагат следните правила:
- Поредицата може да се състои от:
- на последователност символ без интервали, точки, запетаи, запетая;
- от всяка поредица от символи, затворени в ъглови скоби: <.>. Тази последователност може да бъде посочена като пропуски или периоди, запетаи запетая. - С цел да се покаже, че някои знак в низ, който представлява действителен параметър всъщност е символ, а не нещо друго, например, някои от сепаратора или ограничаване на скобата, използван специален оператор. Този оператор е поставен непосредствено преди знака, описан по-горе, и ефектът му е еквивалентно на сключването на герой в скоби.
- Ако искате изчисляването на низ константен израз, в началото на израза, което трябва да се постави знак%.
ConstExpression стойност се изчислява и заместен в табличен формат в съответствие с настоящата корен.
По време на генериране на асемблер макро разширяване преводача на търсенията макро тяло текстови последователности от символи, отговарящи на последователности от символи с тези на които формалните параметри. При откриване на такова съвпадение формален параметър на макро тяло се заменя със съответния действителната параметър на макро. Този процес се нарича аргументи за замяна. Като цяло, в списъка на формалните аргументи да съдържа не само прехвърлянето на формалните елементи, разделени със запетаи, но и допълнителна информация. формален аргумент Пълният синтаксис е както следва:
където тип може да бъде:
- REQ - изисква задължително изрична задача на действителния аргумент, когато се обаждате на макроса;
- =<ЛюбаяСтрока> - ако аргументът, когато се обаждате на макроса не е уточнено, в съответните места в макро разширяване ще въведе стойността по подразбиране, съответстваща на стойността LyubayaStroka. Символите във LyubayaStroka. Трябва да сте затворени в ъглови скоби.
Но не винаги, асемблер може да разпознае в тялото на макро формален аргумент. Такъв може да се случи, когато тя е част от идентификатор. В този случай поредицата от символи официално аргумент е отделена от останалата част от контекста със специален символ , Тази техника често се използва за определяне на променливите идентификаторите и експлоатация кодове. Например,
686p
. модел плоски, stdcall
def_table макро т: REQ. дъл: =<1>
tabl_t DT дъл DUP (5)
endm
.данни
def_table г, 10
def_table б
.код
основната Proc
Mov др. [Tabl_b]
Mov ах. [Tabl_b + 1]
Mov EBX. [Tabl_d]
кисна
основната endp
основната цел
След излъчването на програма текст, съдържащи сегментни линии за данни, ще
def_table г, 10; tabl_d дд 10 DUP (5)
def_table б; tabl_b db 1 DUP (5)
Имайте предвид, че линията на програма
постави в ах число, различни от 5, тъй като паметта е предназначена само за tabl_b под един елемент масив 1 байт със стойност на 5.
символ Тя може да се използва и за признаване на официален аргумент в низ, затворени в кавички "".
Ако макро тяло съдържа етикет или име в директивата за резерват и данни за инициализация, и програмата този макрос се нарича няколко пъти, процесът macrogenerations ситуация, в която на програмата една идентичност ще се определя на няколко пъти, че, разбира се, ще бъдат разпознати от компилатора като грешка. За да излезете от тази ситуация, да се използва местна директива. който има следния синтаксис:
Тази директива трябва да бъде зададен веднага след макрос с глава. В резултат на тази директива ще бъде генериран във всеки случай macroexpansion уникални имена за всички идентификатори, изброени в CpisokIdentifikatorov. Тези уникални имена на формуляра. хххх, където хххх - шестнадесетично число. За първи идентификатор в първата инстанция macroexpansion хххх = 0000 на второто - .. XXXX = 0001 и т.н. контрола на правилното поставяне и използване на тези уникални имена поема преводача.
Например, помислете за използването на макро програма показвано име в диалоговия прозорец.
686P
.МОДЕЛ плоски, STDCALL
PrintName макро име
местно str1, str2, МЕТКА
JMP МЕТКА
Str1 DB "Програма", 0
Str2 DB "Моето име е: Name ", 0
МЕТКА:
PUSH 0
PUSH OFFSET str1
PUSH OFFSET str2
PUSH 0
CALL MessageBoxA @ 16
endm
първоначален макро
Екстернант MessageBoxA @ 16: близо
endm
Init
.CODE
СТАРТ:
PrintName <Лена>
PrintName <Таня>
RET
END СТАРТ
При използване на макро програмен код става по-разбираемо.
Функционално подобен на макро процедура. Тяхната прилика е, че и двамата веднъж е достатъчно, за да се опише, а след това ги наричаме многократно по специален начин. Различията макроси и процедури, в зависимост от целта инсталацията могат да се считат за предимствата и недостатъците на двете:
- за разлика от процедурата, чийто текст е непроменена, в макро macrogenerations могат да варират в съответствие с набор от действителния параметър. В този случай корекцията може да бъде предмет на двете операнди с команди и самите команди. Процедурите в това отношение са по-малко гъвкави;
- всеки път, когато ти се обадя на макроса, тъй като текстът вмъква в програмата за макро експанзия. Когато процедура, изискваща микропроцесор извършва контрол на предаването в началото на процедурата, разположен в район с памет в един екземпляр. Кодът в този случай, по-компактен, въпреки че скоростта е до известна степен намалява поради необходимостта от преходите.