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










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

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

Несколько слов о возможностях макро

Вместо использования параметра WAITFLAG для определения, ассемблировать программный код для его включения или нет, мы также можем использовать глобальную опцию, позволяющую осуществлять этот выбор во время ассемблирования. Например, мы хотим проверить нажатие клавиши, если находимся в режиме отладки или если установлен параметр WAITFLAG, но ни при каких-либо других условиях. Новое макроописание таково:



            @WritToFil MAСRO   WAITFLAG,EKOFLAG
                    LOCAL    bye     ;;определить формальный адрес
                    ;;макро приема символа из стандартного ввода
                    ;;2 аргумента: WAITFLAG и EKOFLAG определяют,
                    ;;ждать символ или отобразить ввод
                    .ХCREF  ;;подавить выдачу перекрестных ссылок
                                     ;;локальных меток и т.д.
                    x = 0            ;; х - индикатор
                    IFNDEF  DEBUG    ;;если параметр DEBUG не опре-
                    x = 1            ;;делен, установить флаг в 1
                    ENDIF            ;;конец проверки условия
                    IFNB   ;;если поле для WAITFLAG
                    x = 2            ;;не пусто, флаг = 2
                    ENDIF            ;;конец проверки условия
                    IF (х EQ 1) or (x eq 2) ;;если не определен
                                ;;DEBUG или не пуст WAITFLAG
                    @ChkChr     ;;проверить, ожидается ли символ
                    cmp     al,0  ;;al = 0 => символ не ожидается
                    je      bye   ;;если символа нет, продолжить
                    ENDIF       ;;конец проверки условия
                    IFIDN ,   ;;если EKOFLAG = EKO,
                                ;;ассемблировать следующую строку
                    mov     ah,06h  ;;функция DOS по записи в
                                    ;;стандартный вывод
                    ELSE            ;;в противном случае
                      IFIDN ,  ;;если EKOFLAG=NOEKO,
                                          ;;ассемблировать
                      mov   ah,40h    ;;функция DOS по записи в файл
                      ELSE       ;;если аргумент не соответствует
                        .ERR     ;;выдать ошибку ассемблирования
                    %OUT Ошибка в макро @WritToFil - EKOFLAG не найден
                  ENDIF             ;;конец проверки условия
                ENDIF               ;;конец проверки условия
                int       21h       ;;вызов DOS
            bye:
                .CREF     ;;восстановить выдачу перекрестных ссылок
                ЕNDМ                ;;конец макро

Теперь во время ассемблирования для определения режима DEBUG мы можем использовать опцию /d:



            MASM  myprgm,,,; /dDEBUG

и все вызовы макро WritToFil будут генерировать программный код, проверяющий ввод.

Для определения, ждем ли мы появление символа, мы используем флаг (с оператором =, а не equ, Так как мы переопределяем его в следующих двух операторах IF). Вместо (x eq 1 ) или (x eq 2) мы могли бы закодировать x gt 0 или x NE 0, тaк как действительно любое значение, отличное от задаваемого при инициализации (0). Заметим, что мы также добавили несколько новых директив. Символы ;; сообщают MASM, что комментарии не должны появляться в листинге ассемблера. Директива .ХСREF экономит время ассемблирования и память для листинга перекрестных ссылок, сообщая MASM, что не нужно загромождать этот листинг именами, используемыми только в макро. Директива .СREF восстанавливает выдачу перекрестных ссылок для оставшейся части листинга. Кроме того, ее можно и не указывать. Мы также добавили директиву %OUT, которая будет выводить на экран вставленное в нее сообщение об ошибке. Теперь мы поэкспериментируем с некоторыми дополнительными возможностями.


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

Hosted by uCoz