assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 71
Текст из файла (страница 71)
Строки могут быть символическими именами, числами или выражениями и должны быть заключены в угловые скобки.Аналогично директиве условной компиляции IFDIF, при сравнении учитывается различие прописных и строчных букв.318Глава 14. Макросредства языка ассемблераж Директива .ERRIDN (ERRIFIDN) генерирует пользовательскую ошибку, если строки посимвольно идентичны. Строчные и прописные буквы воспринимаютсякак разные.Для того чтобы игнорировать различия строчных и прописных букв, существуют аналогичные директивы:ERRIFDIFI <строка_1>,<строка_2>ERRIFIDNI <строка_1>,<строка_2>'я Директива ERRIFDIFI аналогична директиве ERRIFDIF, но игнорируется различиестрочных и прописных букв при сравнении строк <строка_1> и <строка_2>.9 Директива ERRIFIDNI аналогична директиве ERRIFIDN, но игнорируется различие строчных и прописных букв при сравнении строк <строка_1> и <строка_2>.Данные директивы, как и соответствующие им директивы условной компиляции,удобно применять для проверки передаваемых в макрос фактических параметров.Директивы .ERRE (ERRIFE) и .ERRNZ (ERRIF)Синтаксис директив .ERRE (ERRIFE) и .ERRNZ (ERRIF):.ERRE (ERRIFE) константное_выражение.ERRNZ (ERRIF) константное_выражениев Директива .ERRE (ERRIFE) вызывает пользовательскую ошибку, если константное выражение ложно (равно нулю).
Вычисление константного выражения должно приводить к абсолютному значению, и это выражение не может содержатьссылок вперед.ii Директива .ERRNZ(ERRIF) вызывает пользовательскую ошибку, если константное выражение истинно (не равно нулю). Вычисление константного выражения должно приводить к абсолютному значению и не может содержать ссылоквперед.Константные выражения в условных директивахКак вы успели заметить, во многих условных директивах в формировании условия участвуют выражения. Результат вычисления этого выражения обязательнодолжен быть константой. Хотя его компонентами могут быть и символическиепараметры, но их сочетание в выражении должно давать абсолютный результат.К примеру,.datamas db ...ten dd.code.erre(len-mas) It 10 генерация ошибки, если длина;области mas меньше 10 байтКроме того, константное выражение не должно содержать компоненты, которые транслятор еще не обработал к тому месту программы, где находится условная директива.
Также мы отметили, что логические результаты «истина» и «ложь»являются условными в том смысле, что ноль соответствует логическому результа-Дополнительные средства управления трансляцией319ту «ложь», а любое ненулевое значение — «истине». Однако в языке ассемблерасуществуют операторы, которые позволяют сформировать и «чисто логический»результат. Это так называемые операторы отношений, выражающие отношениедвух значений или константных выражений. В контексте условных директив вместе с операторами отношений можно рассматривать и логические операторы.Результатом работы тех и других может быть одно из двух значений:истина — число, которое содержит двоичные единицы во всех разрядах;ложь — число, которое содержит двоичные нули во всех разрядах.Операторы, которые можно применять в выражениях условных директив и которые формируют логические результаты, приведены в табл.
14.1 и 14.2.Таблица 14.1. Операторы отношенийОператор отношенияEQ (equal) — равноСинтаксисвыражение_1 EQвыражение_2РезультатИстина, если выражение_1равно выражение_2NE (not equal) — не равно выражение_1 NEвыражение_2Истина, если выражение_1не равно выражение_2LT (less than) — меньшевыражение_1 LTвыражение_2Истина, если выражение_1меньше выражение_2LE (less or equal) —меньше или равновыражение_1 LEвыражение 2Истина, если выражение_1 меньшеили равно выражение 2GT (greater than) большевыражение_1 GTвыражение_2Истина, если выражение_1больше выражение_2GE (greater or equal) —больше или равновыражение_1 GEвыражение_2Истина, если выражение_1 большеили равно выражение_2Таблица 14.2. Логические операторыЛогический операторNOT — логическоеотрицаниеСинтаксисNOT выражениеРезультатИстина, если выражение ложно;ложь, если выражение истинноAND — логическое Ивыражение_1 ANDвыражение_2Истина, если выражение_1и выражение_2 истинныOR — логическое ИЛИвыражение_1 ORвыражение 2Истина, если выражение_1или выражение 2 истинныXOR — исключающееИЛИвыражение_1 XORвыражение_2Истина, если выражение_1 равнологическому отрицаниювыражения_2Дополнительные средствауправления трансляциейТ ASM предоставляет средства для вывода текстового сообщения во время трансляции программы — директивы DISPLAY и %OUT.
С их помощью можно при необходимости следить за ходом трансляции. К примеру,320Глава 14. Макросредства языка ассемблераdisplay недопустимые аргументы макрокоманды%outнедопустимое имя регистраВ результате обработки этих директив на экран (стандартный выход) будутвыведены тексты сообщений. Если эти директивы использовать совместно с директивами условной компиляции, то, к примеру, можно отслеживать путь, по которому осуществляется трансляция исходного текста программы.Можно предложить читателю уже с этого момента начать формировать наборполезных в его практической работе макрокоманд. В качестве основы вы можетевзять файл mac.inc, который находится в каталоге данной главы среди файлов, прилагаемых к книге1.
В дальнейшем, если в этом возникнет необходимость, вы будете самостоятельно дополнять его вашими макросами. Использовать макроопределения из этого файла очень просто: достаточно включить в нужном месте вашейпрограммы строку с директивой include, в результате в ваш файл будут вставленыстроки из файла, указанного в качестве операнда этой директивы.Основная задача этой книги — научить вас программировать на языке ассемблера. Как вы уже успели понять, нельзя изучать этот язык в отрыве от рассмотрения процессов, происходящих во время выполнения программы на компьютере.Одно из средств изучения таких процессов — отладчик. Однако он решает проблему глобально, что нужно далеко не всегда. Тем более, как мы увидим далее, чтовозможности отладчика не безграничны. Поэтому необходимо иметь более универсальное средство, которое позволило бы «подглядывать» за содержимым регистра или области памяти динамически, во время выполнения программы.
Для этого разработаем еще один макрос и назовем его, к примеру, show. Его аргументомможет быть один из четырех регистров — AL, АН, АХ, ЕАХ. С помощью этого макросаможно визуализировать содержимое любого из доступных регистров или областипамяти длиной до 32 битов. Для этого достаточно лишь переслать содержимое нужного объекта (регистра или ячейки памяти) с учетом его размера в один из регистров AL, АН, АХ, ЕАХ. Имя одного из этих регистров указывается затем в качествефактического аргумента макрокоманды show. Второй аргумент этого макроса —позиция на экране. Задавая определенные значения, мы можем судить о том, какая именно макрокоманда show сработала.
Еще одна немаловажная особенностьданного макроса — в его возможности работать как в реальном, так и в защищенном режимах. Распознавание текущего режима работы процессора выполняетсяавтоматически. Текст макроопределения show довольно велик и по этой причиненаходится среди прилагаемых к книге файлов в каталоге данной главы.
Примериспользования этого макроса приведен в листинге 14.6.Листинг 14.6. Пример использования макроса show;prg_14_6.asmMASMMODELsmallSTACK256.486pInclude show.inc.dataВсе прилагаемые к книге файлы можно найти по адресу http://www.piter.com/download. —Примеч. ред.Директивы управления файлом листинга321poledd 3cdf436fh.codemain:mov a x , @ d a t amov d s . a xxor a x , a xmov a x .
l f O f hshow al,0show ah,160show a x , 3 2 0mov eax.poleshow e a x , 4 8 0exit:mov ax,4c00hint 21hend mainПосвятить время рассмотрению этого макроса полезно еще и потому, что приего разработке было использовано большинство средств, обсуждавшихся в этойглаве.Директивы управления файлом листингаАссемблер предоставляет ряд директив для управления содержимым файла листинга.
Далее приведена их общая характеристика.Общие директивы управления листингом призваны управлять видом файла листинга. Все директивы являются парными, это означает, что если одна директивачто-то разрешает, то другая, наоборот, запрещает.вДирективы %LIST и %NOLIST (.LIST и .XLI5T) определяют необходимость вывода вфайл листинга всех строк исходного кода (по умолчанию). Для запрета выводав файл листинга всех строк исходного кода необходимо использовать директивы .XLIST или %NOLIST.