|
|
|
|
Условное ассемблирование
При написании программ на Ассемблере очень неплохо иметь возможность включения некоторых программных секций. Используя макрокоманды, было бы также
неплохо иметь возможность выбирать различные направления работы программы в зависимости от аргументов, передаваемых в макро. MASM обеспечивает эти
возможности через условное ассемблирование.
Когда может потребоваться условное ассемблировние? Предположим, что Вы пишите большую программу, которая, подобно большинству таких программ,
имеет какие-то ошибки. Для выяснения обстоятельств работы программы Вы решаете поместить в нее некоторые отладочные операторы. Однако , когда у
Вас появится уверенность, что программа выполняется правильно, Вы захотите изъять эти операторы, чтобы программа выполнялась без лишних кодов. Но
так как программа, вероятно, содержит еще много ошибок, отладочные опера торы придется выполнять снова. Добавление и удаление операторов утомительно.
Для решения этой проблемы может быть использовано условное ассемблирование. В Листинге 1-6 показано воздействие пе реключателя "DEBUG" (отладить) на
операторы блока при условном ассемблировании. Реализован хороший способ редактирования программы, а переключатель .SALL использован для подавления
некоторой части макрорасширения @TypeStr. Наш интерес обращен только к строкам, связанным с условным ассемблированием.
Таблица 1-1. Макродирективы
--------------------------------------------------------
Директива Переменная Описание применения
--------------------------------------------------------
mname MACRO parameter_list МАКРООПИСAHИЕ
Сигнализирует о нача-
ле блока макроописа-
ния; parameter_list
определяет формальные
аргументы, используе-
мые в блоке.
ENDM КОНЕЦ МАКРО
Сигнализирует конец
макроописания или бло-
ка повторения REPT,IRP
или IRPC. Наличие обя-
зательно!
EXITM ВЫХОД ИЗ МАКРО
При достижении выход из
макро. Наиболее часто
используется при ус-
ловном ассемблировании.
LOCAL symbol_list ЛОКАЛЬНЫЙ СИМВОЛ
Определяет для ассембле-
ра символы из списка
symbol_list как уникаль-
ные символы.
Расширяется в ??ххх, где
ххх - шестнадцатиричные
числа.
PURGE macro_list УДАЛИТЬ МАКРООПИСAHИЕ
Уничтожает описание макро
из списка macro_list.
REPT выражение ПОВТОРИТЬ
Повторяет блок команд,
размещенных между REPT
и ENDM,столько раз,сколь-
ко задано в выражении.
ITP dummy, НЕОГРAHИЧЕННОЕ ПОВТОРЕНИЕ
Повторяет блок команд
между IRP и ENDM для
каждого значения из para-
meter_list,заменяя фор-
мальный параметр (dummy)на
значение параметра из каж-
дого расширения.
IRPC dummy, строка СИМВОЛ НЕОГРAHИЧЕННОГО
ПОВТОРЕНИЯ
Повторяет блок команд
между IRPC и ENDM для
каждого символа строки,
заменяя формальный пара-
метр на символ из каж-
дого расширения.
---------------------------------------------------------
|
Таблица 1-2. Специальные символы в макрокомандах
---------------------------------------------------------
Символ Описание применения
---------------------------------------------------------
&argument Соединяет формальные аргументы или сим-
волы с текстом. Особенно необходим для
подстановки вместо формальных аргументов
в строках, заключенных в кавычки.
;;comment text Обозначает комментарий. Такой
комментарий никогда не приводится в
макроописании.
!char Указывает, что следующий далее символ
является литералом. Используется для
включения &, % и т.д. в макрорасширения,
когда эти символы могут быть интерпре-
тированы не как специальные.
%symbol Используется для преобразования символа
или выражения в число текущей системы
счисления.
Угловые скобки (< и >) используются для
определения текста, заключенного между
ними, как литерала. Все, что заключено
в такие скобки, может быть передано в
макро как одиночный аргумент.
----------------------------------------------------------
|
Таблица 1-3. Директивы управления листингом в
макрокомандах
----------------------------------------------------------
Директива Описание применения
----------------------------------------------------------
.XALL Приводит исходный и объектный код макрорасши-
рений, исключая исходные строки, которые не
вырабатывают исполнительного кода. Устанав-
ливается по умолчанию.
.LALL Приводит все строки макрорасширения, исключая
комментарии, начинающиеся с удвоенных точкой
с запятой /;;/.
.SALL Исключает код, вырабатываемый макрорасшире-
нием.
.LIST Приводит строки исходного текста программы.
Действие противоположно .XLIST, однако сос-
тояние листинга, определяемое директивами
.XALL, .LALL или .SALL не изменяет.
.XLIST Подавляет любую выдачу. Перекрывает все
другие директивы.
---------------------------------------------------------
|
Листинг 1-6. Условное ассемблирование операторов DEBUG -
FALSE
----------------------------------------------------------------
;часть А - листинг исходного текста
FALSE EQU 0
TRUE EQU 0FFFFh
DEBUG EQU FALSE
.
.
.
@TypeStr 'hello world!'
IF DEBUG <--- начало условного блока
@TypeStr 'Hi -I made it to this point in the program'
ENDIF <--- конец условного блока
.
.
.
;часть В - листинг MASM
@TypeStr 'hello world!'
1 mov dx,offset ??0000
1 mov ax,09h
1 int 21h ;вызвать функцию MS-DOS
ENDIF
----------------------------------------------------------------
|
Данный пример был ассемблирован со значением переключателя DEBUG - FALSE (ложь). В результате от условного блока в листинге MASM после расширения
@TypeStr появляется только оператор ENDIF. Таким образом MASM сообщает, что условный блок присутствовал, но он не ассемблировался. Когда значение
переключателя DEBUG изменяется на TRUE (истина), MASM вырабатывает другую программу, приведенную в Листинге 1-7.
Листинг 1-7. Условное ассемблирование операторов DEBUG -
TRUE
------------------------------------------------------------------
;листинг MASM
DEBUG EQU TRUE
.
.
.
@TypeStr "hello world"
1 mov dx,offset ??0001
1 mov ax,09h
2 int 21h ;вызвать функцию MS-DOS
IF DEBUG
@TypeStr 'Hi -I made it to this point in the program'
1 mov dx,offset ??0002
1 mov ah,09h
2 int 21h ;вызвать функцию MS-DOS
ENDIF
----------------------------------------------------------------
|
Все это время отладочные операторы присутствовали в программе. MASM также включает в листинг строку, вызывающую ассемблирование операторов. Если Вы
предпочитаете увидеть в файле листинга все директивы условного ассемблирования вне зависимости от того, имеют они значение TRUE или FALSE,
используйте директиву .LFCOND (включить список ложных состояний). Позднее Вы можете подавить выдачу ложных состояний при помощи директивы .SFCOND
(подавить выдачу ложных состояний). В основном, блок условного ассемблирования начинается с одной из разновидностей оператора IF (если)
(см. полный список в Табл. 1-4) и заканчивается оператором ENDIF.
Обычно использование переключателей TRUE/FALSE в условном ассемблировании возникает при программировании систем (программирование операционных систем
компьютеров). Если для Вашего компьютера имеется исходный текст операционной системы на языке ассемблера, просмотрите его. Вы наверняка найдете, что
условное ассемблирование используется в нем весьма интенсивно. Условное ассемблирование позволяет проектировщику писать одну операционную
систему, а через использование переключателей - конфигурировать ее на конкретный набор аппаратных средств. Эти переключатели, подобно переключателю
DEBUG из нашего примера, позволяют сгенерировать работающую систему для данного типа, количества или конфигурации памяти, пульта, периферийных устройств,
драйверов и т.д.
Некоторые выражения, которые при вычислении дают 0 или имеют значение 0, MASM рассматривает как FALSE. Ненулевые значения рассматривает как
TRUE. Обычно для символа TRUE используется шестнадцатиричное значение FFFFh. Это разрешает использовать TRUE в любых битовых операциях. Например,
поразрядное выполнение AND (логическое И) над 0001 и 1000 равно 0000, так как хотя оба значения и истинны, их логическое произведение должно
быть ложно. Вспомните, что MASM использует одни и те же операторы как для логических, так и для битовых операций.
Таблица 1-4. Директивы условного ассемблирования
---------------------------------------------------------
Директива Переменная Описание применения
---------------------------------------------------------
IF выражение IF TRUE (если истина)
Если значение выражения не
нулевое, операторы условно-
го блока ассемблируются.
IFE выражение IF FALSE (если ложь)
Если значение выражения рав-
но нулю, операторы условного
блока ассемблируются.
ELSE ELSE (иначе)
Если значение условной ди-
рективы ассемблирования рав-
но FALSE (ложь) (условный
блок не ассемблируется),
ассемблируются альтернатив-
ные операторы блока ELSE.
Завершает блок IFXXXX, хотя
после должно следовать ENDIF.
Действительно только после
оператора IFXXXX.
ENDIF END блока IF (конец блока IF)
Завершает блок IFхххх или
ELSE.
IF1,IF2 IF MASM проход 1, IF MASM
проход 2
Ассемблирует условный блок,
если MASM-ассемблер осущест-
вляет указанный проход.
См.взаимозависимость между IF1
и IF2 и IFDEF и IFNDEF.
IFDEF символ IF cимвол DEFINED (если сим-
вол определен)
IFNDEF символ IF символ NОT DEFINED (если
символ не определен)
Выясняет, определен ли сим-
вол или он имеет внешнее
объявление. IFNDEF противо-
положно IFDEF. См. взаимо-
связь с проходами ассемблера.
IFB <аргумент> IF аргумент BLANK (если ар-
гумент пуст).
IFNB <аргумент> IF аргумент NOT BLANK (если
аргумент не пуст).
Выясняет, пуст ли аргумент.
Используется для определения
передаваемых параметров мак-
ро. IFNB противоположноIFB.
Наличие угловых скобок обя-
зательно.
IFIDN , IF строка1 IDENTICAL TO
строка2 (если строка1 иден-
тична строке2)
IFDIF , IF строка1 DIFFERENT FROM
строка2 (если строка1 отлич-
на от строки2)
Определяет, идентичны ли
строка1 и строка2. IFDIF
противоположно IFIDN.
Наличие угловых скобок обя-
зательно.
---------------------------------------------------------
|
|
|