 |
аргумента в списке аналогична той, которая описана выше для вызо-
ва общей макрокоманды, состоящей из нескольких строк. Список ар-
гументов всегда нужно заключать в угловые скобки (<>).
В синтаксисе директива IRPC аргумент состоит из одной стро-
ки. Строка может содержать столько символов, сколько вы хотите.
Турбо Ассемблер 3.0/tasm/#2-2 = 42 =
Для каждого аргумента или символа в строке Турбо Ассемблер
будет включать в модуль тело макрокоманды, подставляя вместо фор-
мального аргумента аргумент или символ (когда он его находит).
Например:
IRP reg
PUSH reg
ENDM
дает следующее:
PUSH ax
PUSH bx
PUSH cx
PUSH dx
а директива IRPC:
IRPC LUCKY,1379
DB LUCKY
ENDM
дает следующее:
DB 1
DB 2
DB 3
DB 4
Используйте директива IRPC аккуратно, поскольку Турбо Ас-
семблер помещает каждый символ в строке в макрорасширение "как
есть", поэтому макрокоманда строкового повторения:
IRPC CHAR,HELLO
DB CHAR
ENDM
может дать не DB 'H','E'','L','L','O', а DB H,E,L,L,O (где каждая
буква интерпретируется как имя идентификатора.
Непосредственная макродиректива %
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Непосредственная макродиректива % интерпретирует строку
текста так, как если бы это было тело макрокоманды. Приведем ее
синтаксис:
# строка_тела_макрокоманды
где "строка_тела_макрокоманды" представляет тело макрокоманды,
используемое для непосредственного макрорасширения, например:
SEGSIZE EQU
Турбо Ассемблер 3.0/tasm/#2-2 = 43 =
LANGUAGE EQU
% MODEL SEGSIZE,LANGUAGE ; дает MODEL TINY,WINDOWS PASCAL
Включение расширения макрокоманды в файл листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Расширения макрокоманд, состоящих из нескольких строк, обыч-
но включаются в файл листинга. Однако в Турбо Ассемблере предус-
мотрены следующей директивы:
- .LALL
- .SALL
- .XALL
- %MACS
- %NOMACS
которые позволяют управлять листингом макрорасширений.
Примечание: Подробнее об этих директивах рассказывает-
ся в Главе 17.
Турбо Ассемблер 3.0/tasm/#2-2 = 44 =
Глава 15. Использование условных директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Существует два класса условных директив: директивы условного
ассемблирования и условные директивы генерации сообщений об ошиб-
ке. С помощью директив условного ассемблирования вы можете управ-
лять тем, какой код будет ассемблироваться в программе при опре-
деленных условиях.
Директивы условного ассемблирования позволяют вам генериро-
вать во время ассемблирования сообщения об ошибках при наступле-
нии определенных событий. Турбо Ассемблер выводит сообщение об
ошибке на экран и в файл листинга и предотвращает создание объек-
тного файла. В данной главе описывается, как можно использовать
имеющиеся условные директивы.
Синтаксис условных директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Тремя директивами условного ассемблирования являются дирек-
тивы IFxxx, ELSEIFxxx и ERRxxx. Эти директивы используются также,
как операторы условия в языках высокого уровня.
Турбо Ассемблер 3.0/tasm/#2-2 = 45 =
Директива условного ассемблирования IFxxx
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Вы можете использовать директиву условного ассемблирования
IFxxx для определения блока кода, который включается в объектный
файл при удовлетворении определенных условий (таких как определе-
ние идентификатора или установка какого-то значения). Приведем
синтаксис оператора условного ассемблирования:
IFxxx
тело_условия_true
EMDIF
или
IFxxx
тело_условия_true
ELSE
тело_условия_false
ENDIF
где IFxxx представляет следующие директивы:
IF
IF1
IF2
IFDEF
IFNDEF
IFB
IFNB
IFIDN
IFIDNI
IFDIF
IFDIFI
Каждая директива условного ассемблирования IFxxx задает
конкретное условие, при вычислении которого получается истинное
(true) или ложное (false) значение. Если условие имеет значение
true, то выполняется ассемблирование и помещение в объектный файл
блока ассемблируемого кода "тело_условия_true". Если при вычисле-
нии условия получается значение false, то Турбо Ассемблер пропус-
кает "тело_условия_true" и не включает его в объектный файл. При
наличие директивы ELSE, если условие имеет значение false, то ас-
семблируется и выводится в объектный файл блок "тело_усло-
вия_false". Если условие имеет значение true, то этот блок игно-
рируется. Условный блок завершается директивой ENDIF.
Кроме особых случаев директив IF1 и IF2 (которые мы обсудим
позднее) два описанных блока кода являются взаимноисключающими:
в объектный файл включается либо "тело_условия_true", либо "тело_
условия_false", но не оба блока одновременно. Кроме того, если вы
используете форму IFxxx...ELSE...ENDIF, один из блоков будет обя-
зательно включаться в объектный файл. Если используется форма
IFxxx...ENDIF, то "тело_условия_true" может включаться или не
Турбо Ассемблер 3.0/tasm/#2-2 = 46 =
включаться в объектный файл, в зависимости от условия.
При использовании вложенных директив IF и ELSE директива
ELSE всегда соответствует ближайшей директиве IF.
В следующем примере test является идентификатором, который
управляет включением кода (если идентификатор не определен, то
генерируется соответствующий блок кода) Идентификатор color уста-
навливается в ненулевое значение, если дисплей цветной, и равен
0, если дисплей монохромный.
От этих значений зависит фактическая генерация кода:
.
.
.
IFDEF test ; true, если test определен
; первая часть блока кода ; если test определен
IF color ; true, если color <> 0
; блок кода color ; если color <> 0
 |
|