На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 1 / Условное ассемблирование Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Условное ассемблирование

При написании программ на Ассемблере очень неплохо иметь возможность включения некоторых программных секций. Используя макрокоманды, было бы также неплохо иметь возможность выбирать различные направления работы программы в зависимости от аргументов, передаваемых в макро. 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.
                                          Наличие угловых скобок обя-
                                          зательно.
            ---------------------------------------------------------

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz