Использование в макрокомандах символа &
Символ & в теле макрокоманды имеет специальное значение. В общем случае & отделяет имя формального аргумента от окружающего текста, благодаря чему Турбо Ассемблер может распознавать его при подстановке. Если, например, имеется следующее тело макрокоманды:
sym&foo: DB "It is &foo time"
и если вы при вызове данной макрокоманды присвоите foo текстовую строку party, то фактическим включаемым в модуль текст будет следующее:
symparty: DB "It is party time"
В качестве другого примера можно привести следующий:
foo&sym: DB "We are in O&foo&o"
Если вы при вызове данной макрокоманды присвоите foo текстовую строку hi, то фактическим включаемым в модуль текст будет следующее:
hisym: DB "We are in Ohio"
Приведем правила для символа &:
вне заключенных в кавычки строк символ & используется как разделитель;
внутри заключенной в кавычки строки и после двоеточия, которое не находится в заключенной в кавычки строке в режиме Ideal, символ & должен предшествовать формальному аргументу (чтобы этот аргумент мог распознаваться);
при расширении макрокоманды Турбо Ассемблер удаляет один символ & из группы таких символов.
Последний пункт дает возможность помещать внутри макрокоманд макроопределения, требующие символа &. Турбо Ассемблер будет удалять только один символ & из группы.
Включение комментариев в тело макрокоманды
В особенно сложных макрокомандах иногда желательно поместить в теле макрокоманды комментарии, которые не должны включаться при ее расширении. Это также уменьшает объем необходимой Турбо Ассемблеру для обработки макрокоманд памяти. Для этого используйте комментарий с предшествующей двойной точкой запятой (в начале строки). Например, следующее тело макрокоманды:
;; Это макрокоманда с комментарием DB "макрокоманда с комментарием"
приведет к включению при ее вызове только следующего текста:
DB "макрокоманда с комментарием"
Примечание: Комментарии с одиночной точкой с запятой при вызове макрокоманды всегда включаются в макрорасширение.
Локальные формальные аргументы
В начале тела макрокоманды вы всегда можете включить одну или более директив LOCAL. Директива LOCAL описывает специальные формальные аргументы, которым при каждом расширении макрокоманды будет присваиваться уникальное символьное имя.
Синтаксис директивы LOCAL в теле макрокоманды выглядит следующим образом:
LOCAL формальный_аргумент_1 [,формальный_аргумент_2].
Если имя "формальный_аргумент", указанное в директиве LOCAL, не содержит префикс локального идентификатора, то присваиваемое ему уникальное имя идентификатора будет иметь вид ??xxxx, где xxxx представляет шестнадцатиричное число. В противном случае уникальное символьное имя будет иметь вид <локальный_префикс>xxxx.
Примечание: Подробности о разрешении локальных идентификаторов и задании локального префикса можно узнать в этой главе.
Вы можете использовать формальные аргументы LOCAL для задания в теле макрокоманды меток, например:
LOCAL @agn, @zero XOR dx,dx MOV cx,exp MOV ax,1 JCXZ @zero MOV bx,factor @agn: MUL bx LOOP @agn @zero:
Директива EXITM
Директиву EXITM можно использовать в теле макрокоманды для принудительного завершения ассемблирования включаемого тела макрокоманды. Она имеет следующий синтаксис:
EXITM
Когда Турбо Ассемблер обнаруживает директиву EXITM в теле макрокоманды, которая включена в исходный код модуля, ассемблирование расширенного тела макрокоманды немедленно прекращается. Вместо этого Турбо Ассемблер будет продолжать ассемблирование модуля после конца макрокоманды.
Для завершения макрокоманды при определенных условиях вы можете использовать оператор EXITM с директивой условного ассемблирования.
Примечание: Директивы условного ассемблирования подробнее рассматриваются здесь.
Директива GOTO и макроидентификаторы перехода
Использование директивы GOTO и макроидентификаторов перехода позволяют вам управлять последовательностью расширения строк макрокоманды. Вы можете поместить цель перехода в любом месте тела макрокоманды. Она занимает всю строку макрокоманды и имеет следующий синтаксис:
:идентификатор_перехода
При расширении макрокоманды все макроидентификаторы перехода отбрасываются.
Директива GOTO сообщает Турбо Ассемблеру, что нужно перейти на заданную точку исходного кода, а именно - на "идентификатор_перехода". Это позволяет вам поместить GOTO в блоке условного ассемблирования. Например:
IF foo GOTO tag1 ENDIF DISPLAY "foo имеет значение false!" :tag ; возобновление макрокоманды. ; работает одинаково, независимо от того, ; равно foo false или true
Примечание: Будьте аккуратны и не создавайте при использовании директивы GOTO бесконечных циклов. Бесконечные циклы могут привести к тому, что Турбо Ассемблер исчерпает доступную память или даже прекратит работу.
Подробнее о директивах условного ассемблирования рассказывается здесь.
1 2 3 4 5 6
8 8 8
| |