 |
возможностью использования макрокоманд из нескольких строк с ар-
гументами это превращает макросредства Турбо Ассемблера в очень
мощный инструмент. В данной главе описывается, как можно исполь-
зовать в программах текстовые макрокоманды и макрокоманды, состо-
ящие из нескольких строк.
Текстовые макрокоманды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Текстовая макрокоманда - это идентификатор, представляющий
строку текстовых символов. Когда Турбо Ассемблер обнаруживает
идентификатор в выражениях (и в других ситуациях), он подставляет
вместо него текстовые символы. Например, если DoneMsg - это текс-
товая макрокоманда, имеющая значение "Returning to DOS", то сле-
дующий оператор:
GoodBy DB DoneMsg
дает в результате:
GoodBy DB 'Returning to DOS'
Определение текстовых макрокоманд с помощью директивы EQU
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для определения простых текстовых макрокоманд можно исполь-
зовать директиву EQU.Приведем синтаксис определения текстовой ма-
крокоманды:
имя EQU текстовая_строка
где "текстовая_строка" связывается с текстовой макрокомандой с
именем "имя". Для выделения текста вы можете заключить текстовую
строку в угловые скобки (<>), например:
DoneMsg DB <'Returning to DOS'>
Если в режиме MASM вы опустите скобки, то Турбо Ассемблер
будет определять, можно ли свести текстовую строку к выражению.
Если ее вычислить нельзя, Турбо Ассемблер будет интерпретировать
текстовую строку как текстовую макрокоманду (чтобы сохранить
совместимость c MASM). Чтобы обеспечить правильное определение
текстовой строки, нужно всегда заключать ее в угловые скобки.
Рассмотрим следующие ошибки, которые могут возникать, если вы
этого не делаете:
Турбо Ассемблер 3.0/tasm/#2-2 = 27 =
Earth EQU dirt ; Earth = "dirt"
Planet EQU Earth ; Planet = "dirt" (неверно!)
Planet EQU ; Planet = "Earth" (верно!)
В режиме Ideal оператор EQU всегда определяет текстовую мак-
рокоманду.
Текстовые макрокоманды являются переопределяемыми. Вы може-
те переопределить текстовую макрокоманду в том же модуле другой
текстовой строкой.
Директивы макрокоманд работы с текстовыми строками
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Ассемблер обеспечивает директивы, которые могут рабо-
тать с текстовыми макрокоманд. Эти директивы доступны в режиме
Ideal и для версий M510, M520 и T300 (как задается директивой
VERSION).
Строковые аргументы для любой из этих директив могут быть
следующими:
- текстовой строкой, заключенной в скобки, например, ;
- именем ранее определенной текстовой макрокоманды;
- выражением с предшествующим символом %, значение которого
эквивалентно числовому представлению строки для текущего
основания.
Турбо Ассемблер 3.0/tasm/#2-2 = 28 =
Директива CATSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива CATSTR определяет новую текстовую макрокоманду пу-
тем конкатенации строк. Она имеет следующий синтаксис:
имя CATSTR строка[,строка]...
Директива CATSTR выполняет конкатенацию слева-направо. Турбо
Ассемблер создает новую текстовую макрокоманду с именем "имя".
Директива SUBSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива SUBSTR определяет новую текстовую макрокоманду,
которая является подстрокой строки. Она имеет следующий синтак-
сис:
имя SUBSTR строка,выражение_позиции[,выражение_размера]
Новая текстовая макрокоманда с именем "имя" состоит из части
строки , начинающейся с символа в позиции "выражение_позиции" и
длины "выражение_длины". Если вы не указываете "выражение_разме-
ра", новая текстовая макрокоманда содержит остаток строки, начи-
ная с символа в "выражении_позиции". Турбо Ассемблер рассматрива-
ет первый символ строки как позицию 1.
Директива INSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива INSTR возвращает позицию одной строки внутри дру-
гой. Она имеет следующий синтаксис:
имя INSTR [выражение_начала,]строка_1,строка_2
Турбо Ассемблер присваивает "имя" числовому значению, кото-
рое соответствует первой позиции первого вхождения "строки_2" в
"строку_1". Первый символ "строки_1" имеет позицию 1. Если "стро-
ка_2" в "строке_1" не содержится, то Турбо Ассемблер возвращает
значение 0. Если вы укажете "выражение_начала", то поиск начина-
ется с символа, задаваемого этим выражением. Первый символ строки
находится в позиции 1.
Директива SIZESTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива SIZESTR возвращает длину текстовой макрокоманды
(число символов в строке). Она имеет синтаксис:
имя SIZESTR строка
где "имя" устанавливается в числовое значение, равное длине ука-
занной строки. Нулевая строка <> имеет длину 0.
Турбо Ассемблер 3.0/tasm/#2-2 = 29 =
Примеры макрокоманд работы с текстом
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Следующие примеры показывают, как работают эти операции:
VERSION T300
ABC EQU ; ABC = "abc"
ABC2 EQU ABC ; ABC2 = "ABC"
ABC EQU ; ABC = "det"
; (переопределяется)
ABC3 CATSTR ABC2,<,>,ABC,<,>,ABC2 ;ABC3 = "ABC,DEF,
; ABC"
ABCLEN SIZESTR ABC ; ABCLEN = 3
ABC3LEN SIZESTR ABC3 ; ABC3LEN = 11
COMMA1 INSTR ABC3,<,> ; COMMA1 = 4
COMMA2 INSTR COMMA1+1,ABC3,<,> ; COMMA2 = 8
ABC4 SUBSTR ABC3,5 ; ABC4 = "def,ABC"
ABC5 SUBSTR ABC3,5,3 ; ABC5 = "def"
ABC6 EQU 3+2+1 ; ABC6 = 6
; (числовое
; присваивание)
ABC7 EQU %3+2+1 ; ABC7 = "6"
; (текстовая
; макрокоманда)
ABC8 EQU %COMMA1 ; ABC8 = "4"
Макрокоманды, состоящие из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Макрокоманды, состояние из нескольких строк, позволяют вам
определить в их теле инструкции, директивы или другие макрокоман-
ды, которые будут включаться в исходный код при вызове макроко-
манды. Вы можете указать аргументы макрокоманды, которые Турбо
Ассемблер будет подставлять в тело макрокоманды при ее включении
в модуле.
Существует насколько типов макрокоманд, состоящих из нес-
кольких строк. Одна версия подставляет каждый элемент строки
(один за другим), который является аргументом макрокоманды. Дру-
гая версия повторяет определенное число раз тело макрокоманды.
Наконец, в одном месте вы можете определить еще одну версию, ко-
торая будет много раз вызываться. Все эти версии имеют общее оп-
ределение тела макрокоманды.
Тело макрокоманды, состоящей из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Независимо от содержимого тела макрокоманды, средство обра-
ботки макрокоманд Турбо Ассемблера интерпретирует макрокоманду,
состоящую из нескольких строк, как просто несколько строк текста.
Турбо Ассемблер позволяет вам заменить идентификаторы в теле мак-
рокоманды текстом, заданным при вызове макрокоманды. Это средство
Турбо Ассемблер 3.0/tasm/#2-2 = 30 =
называется подстановкой аргументов. Идентификаторы в теле макро-
команды, которые должны быть заменены, называются формальными
(фиктивными) аргументами. Предположим, например, что идентифика-
тор foo - это формальный аргумент в следующем теле макрокоманды:
 |
|