Общие макрокоманды, состоящие из нескольких строк
Турбо Ассемблер связывает тело макрокоманды, состоящей из нескольких строк (включая директивы, инструкции и другие макрокоманды) с символьным именем макрокоманды. При использовании имени макрокоманды в качестве директивы Турбо Ассемблер включает в программу тело макрокоманды (операторы). Таким образом вы можете использовать макрокоманду, состоящую из нескольких строк, несколько раз.
Приведем синтаксис общей макрокоманды из нескольких строк режима Ideal:
MACRO имя список_параметров тело_макрокоманды ENDM
В режиме MASM общее определение макрокоманды из нескольких строк имеет следующий синтаксис:
имя MACRO список_параметров тело_макрокоманды ENDM
где "имя" - это имя определяемой вами макрокоманды из нескольких строк. "Тело_макрокоманды" содержит операторы, которые составляет тело макрорасширения. В макрокоманду вы можете помещать любые допустимые операторы Турбо Ассемблера (и любое их число). Макрокоманду завершает ключевое слово ENDM.
В следующем примере определяется макрокоманда с именем PUSHALL, которая при вызове включает в вашу программу тело макрокоманды, состоящее из трех инструкций PUSH:
PUSHALL MACRO PUSH AX BX CX DX PUSH DS SI PUSH ES DI ENDM
"Список_параметров" - это список формальных аргументов (их идентификаторов) макрокоманды. Он имеет следующий синтаксис:
[формальный_аргумент [,формальный_аргумент].]
В макрокоманде вы можете использовать любое число формальных аргументов (если они не умещаются на одной строке, для продолжения на другой строке можно использовать символ /). Например:
ADDUP MACRO dest,\ ; dest - это первый формальный ; аргумент, а s1,s2 - ; это второй и третий ; аргумент макрокоманды MOV dest,s1 ADD dest,s2 ENDM
Каждый формальный аргумент имеет следующий синтаксис:
имя_формального_аргумента[:тип_аргумента]
где "имя_аргумента" - это символьное имя, используемое для подстановки (вместо него) фактического параметра, передаваемого макрокоманд при ее вызове. Необязательный "тип_аргумента" задает какую-то информацию о виде фактического параметра, воспринимаемого при вызове макрокоманды. Поддерживаются следующие типы:
Типы формальных аргументовТип | Значение |
---|
REQ | Аргументы не могут быть нулевыми или состоять из пробелов. | =<текстовая_строка> | Заключенная в кавычки текстовая строка задает используемое по умолчанию значение аргумента (когда фактический аргумент является нулевым или состоит из пробелов). | VARARG | Фактический аргумент состоит из остальной части макровызова, интерпретируемого как список аргументов. Для обеспечения этой интерпретации используются угловые скобки, запятые. | REST | Фактический аргумент состоит из остальной части макровызова, интерпретируемого как непосредственный текст. |
Вызов общей макрокоманды, состоящей из нескольких строк
Чтобы вызвать общую макрокоманду, используйте в вашей программы в качестве директивы имя макрокоманды. Турбо Ассемблер вставляет в этой точке модуля (поле подстановок всех формальных аргументов) тело макрокоманды. При вызове общей макрокоманды, состоящей из нескольких строк, используется следующий синтаксис:
имя_макрокоманды [аргумент [[,]аргументе].]
где "имя_макрокоманды" - это идентификатор макрокоманды. Если вы вызываете макрокоманду с аргументами, то список аргументов указывается после имени макрокоманды. Вы можете задать любое число аргументов, но все они должны умещаться на одной строке. Аргументы нужно отделять друг от друга запятыми или пробелами. При расширении макрокоманды Турбо Ассемблер заменяет первый формальный аргумент макроопределения первым передаваемым аргументом, второй аргумент - вторым аргументом и т.д.
Каждый "аргумент" представляет текстовую строку. Вы можете задать эту текстовую строку следующими способами:
как непрерывную группу символов, не содержащую пробелов, запятых или двоеточий;
как группу символов, выделенную угловыми скобками (<>), которая может содержать пробелы, запятые и двоеточия;
как одиночный символ с предшествующим знаком !, что эквивалентно заключению символа в угловые скобки;
как выражение с предшествующим символом %, которое представляет текстовое значение выражения, соответствующее текущему выбранному основанию.
Литеральные строки в угловых скобках
Используйте угловые скобки для выделения литеральной строки, содержащей символы-разделители. Следует использовать следующий синтаксис:
<текст>
где "текст" интерпретируется как одиночный строковый параметр, даже если он содержит запятые, пробелы или символы табуляции, которые обычно разделяют параметры. Используйте данную операцию, когда вы хотите передать аргумент, содержащий один из таких символов.
Вы можете также использовать эту операцию, чтобы Турбо Ассемблер интерпретировал символ литерально, не придавая ему специальное значение. Например, если вы хотите передать в качестве параметра макровызова точку с запятой (;), то чтобы предотвратить ее интерпретацию как комментария, вы можете заключить ее в угловые скобки (<;>). При преобразовании заключенной в скобки строки в текстовый аргумент Турбо Ассемблер убирает только один уровень угловых скобок. Это позволяет вызывать макрокоманду, требующую наличия угловых скобок, из другой макрокоманды.
Символ !
Символ ! позволяет вам вызывать макрокоманду с аргументами, которые содержат специальные символы. Указание этого символа перед другим символом эквивалентно заключению этого второго символа в угловые скобки. Например, !; действует также, как <;>. Некоторые общие случаи использования данного символа показаны в следующей таблице:
Использование специального символа !Строка | Полученные в результате символ |
---|
!> | > | !< | < | !! | ! |
1 2 3 4 5 6
8 8 8
| |