 |
і текст_строка_2 і различны. і
і і і
і.ERRDIF текст_строка_1, і "текст_строка_1" и "текст_строка_2" і
і текст_строка_2 і различны (только для режима MASM). і
і і і
іERIFDIFI текст_строка_1,і "текст_строка_1" и "текст_строка_2" і
і текст_строка_2 і различны (регистр символов игнориру- і
і і ется). і
і і і
і.ERRFIFI текст_строка_1,і "текст_строка_1" и "текст_строка_2" і
і текст_строка_2 і различны (регистр символов игнориру- і
і і ется) - только для режима MASM. і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Используйте эти директивы для проверки передаваемых макроко-
мандам аргументов (однако их можно использовать не только в мак-
рокомандах).
При использовании их в макроопределениях директивы IFB и
IFNB позволяют определить, передали ли вы в макрокоманду нужное
число аргументов. Если при вызове макрокоманды вы передали слиш-
ком мало аргументов, Турбо Ассемблер не генерирует сообщение об
ошибке. Незаданные аргументы просто остаются пустыми. Таким обра-
Турбо Ассемблер 3.0/tasm/#2-2 = 55 =
зом, вы можете определить макрокоманду, воспринимающую переменное
число аргументов. Например:
.
.
.
load MACRO addr, reg
IFNB
MOV reg,addr
ELSE
MOV ax,addr
ENDIF
ENDM
.
.
.
Вы можете вызывать макрокоманду данного примера, как load
test,cx, что даст генерацию инструкции mov cx,test, или вызвать
ее как load test, то приведет к генерации инструкции mov ax,test,
поскольку второй параметр пуст. Можно также использовать директи-
ву ERRIFB для генерации сообщения об ошибке, если в вызове макро-
команды пропущен аргумент:
.
.
.
load MACRO addr
ERRIFNB
MOV reg,addr
ENDM
.
.
.
Если эту макрокоманду вызвать с помощью load, а не с помощью
load test, то будет генерироваться ошибка.
Турбо Ассемблер 3.0/tasm/#2-2 = 56 =
Условия выполнения прохода Ассемблером
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Следующие директивы обеспечивают выполнение условного ас-
семблирования или генерацию ошибки на основе текущего прохода Ас-
семблера:
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Директива IFxxx і ассемблирует "тело_условия_true", если:і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і IF1 і Турбо Ассемблер выполняет первый проход.і
і IF2 і Турбо Ассемблер выполняет второй проход.і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Директива ERRxxx і генерирует ошибку user error, если: і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ERRIF1 і Турбо Ассемблер выполняет первый проход.і
і і і
і .ERR1 і Турбо Ассемблер выполняет первый проході
і і (только для режима MASM). і
і і і
і ERRIF2 і Турбо Ассемблер выполняет второй проход.і
і і і
і .ERR2 і Турбо Ассемблер выполняет второй проході
і і (только для режима MASM). і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Обычно Турбо Ассемблер работает как однопроходный ассемблер.
Если вы используете средство многопроходной работы Турбо Ассемб-
лера (вызывая его с параметром командной строки /m), то при не-
обходимости используется несколько проходов.
Поскольку Турбо Ассемблер всегда выполняет по крайней мере
один проход, директива условного ассемблирования IF1 всегда будет
ассемблировать код своего условного блока, а директивы .ERR1 и
ERRIF1 всегда будут генерировать сообщение об ошибке (но только
на первом проходе).
Если вы используете любую из этих директив и не разрешаете
многопроходную работу, то Турбо Ассемблер будет генерировать для
всех таких директив предупреждение "Pass dependent construction"
("Конструкция, зависящая от прохода"), чтобы предупредить вас о
возможно опасном пропуске кода. Если вы разрешите многопроходную
работу, Турбо Ассемблер будет выполнять точно два прохода и гене-
рировать предупреждение Vaximum compatibility pass was done (Вы-
полнен проход с целью обеспечения максимальной совместимости).
Включение условных директив в файл листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Обычно код условного ассемблирования с ложным условием
(false) в листинг не включается. Используя директивы Турбо Ас-
Турбо Ассемблер 3.0/tasm/#2-2 = 57 =
семблера и параметры командной строки, вы можете это переопреде-
лить.
Примечание: Более подробная информация содержится в
Главе 2 и Главе 17.
Турбо Ассемблер 3.0/tasm/#2-2 = 58 =
Глава 16. Интерфейс с компоновщиком
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Модульные программы обычно состоят из нескольких независимых
частей кода, называемых модулями. Компилятор обрабатывает каждый
из этих модулей независимо, а компоновщик (TLINK) объединяет по-
лученные части вместе для создания выполняемого файла. О том, как
использовать TLINK, рассказывается в документации по компилятору,
но важно также знать, как определить и включить все файлы и биб-
лиотеки, которые могут понадобиться при компоновке. В данной Гла-
ве рассказывается о том, как это сделать.
Описание внешних идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Может оказаться так, что вам потребуется использовать неко-
торые переменные или процедуры во всех модулях вашей программы.
Турбо Ассемблер обеспечивает несколько директив, которые позволя-
ют вам определить идентификаторы и библиотеки таким образом, что
вы сможете использовать их глобально, а также использовать общие
переменные (для которых выделяет память компоновщик). Вам потре-
буется также соблюдать аккуратность при назначении имен идентифи-
каторов, поскольку различные языки имеют здесь конкретные требо-
вания. В следующий нескольких разделах мы обсудим эти директивы и
соглашения по наименованию.
Соглашения для конкретного языка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда вы назначаете имена идентификаторам, которые планиру-
ется использовать глобально, нужно помнить об использовании спе-
цификатора языка. К именам переменных предъявляются следующие
требования:
- в Паскале имена указываются символами в верхнем регистре;
- в Си/С++ имен должны начинаться с символа подчеркивания
(_). Остальная часть имени записывается символами в нижнем
регистре.
Параметр /m (описанный в Главе 2) сообщает Турбо Ассемблеру,
что во всех именах идентификаторов нужно различать регистр. Пара-
метр /mx (также описанный в Главе 2) указывает, что различать ре-
гистр символов нужно только во внешних и общедоступных идентифи-
каторах, и что все другие идентификаторы в исходном файле записа-
ны в верхнем регистре. Когда вы используете эти два параметра
вместе, для идентификаторов, описанных в Паскале, они имеют спе-
циальное значение: они приводят к тому, что рассматриваемые иден-
тификаторы будут доступны компоновщику, как идентификаторы в
верхнем регистре.
Турбо Ассемблер 3.0/tasm/#2-2 = 59 =
Описание общедоступных идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
При описании общедоступного идентификатора вы предполагаете,
что он должен быть доступен из других модулей. Общедоступными мо-
гут быть следующие типы идентификаторов:
- имена переменных;
- метки программы;
- числовые константы, определенные с помощь EQU.
Для определения общедоступных идентификаторов можно исполь-
зовать директиву PUBLIC, которая имеет следующий синтаксис:
PUBLIC [язык] идентификатор [,[язык] идентификатор] ...
 |
|