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










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

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

Некоторые предупреждения по использованию условного ассемблирования и макросов в MASM

Применяя макросы, мы старались забыть, что они вырабатывают построчный код и не вызывают программ. Хотя это и представляет некоторые преимущества при быстрой генерации программного кода и освобождает нас от ограничений по использованию стека, результатом линейной программы является более объемный код. Как программист, Вы должны решить, когда целесообразно вызывать быстро работающее макро, а когда - подпрограмму, экономящую память, но имеющую разветвленную структуру. В общем случае используйте макро, когда программный код невелик, а время критично, или когда Вы хотите конфигурировать программу, настроив ее на конкретные условия. Используйте подпрограмму, когда программный код велик и его нужно расположить в одном месте (так, чтобы его можно было легко изменить).


Другим тонким моментом работы макро является использование символов. Вы помните, что символы определяются при помощи оператора equ или =. Затем эти символы вычисляются MASM и заменяются их значениями. Иногда случается, что программист забывает, что аргументы макро не являются символами и наоборот. Согласно Руководству по MASM аргументы макро заменяются действительными параметрами с использованием подстановки "один к одному". Аргументы макро могут создаваться в одном макро и, используя возможность текстовой подстановки, передаваться как составная строка текста в другое макро. Это невозможно с символами. Символам может быть присвоено текстовое значение при помощи оператора equ, что не позволяет модифицировать их впоследствии. Только оператор = разрешает присваивать символам цифровые значения или атрибуты TYPE. Пример такого ограничения и один из способов его обхода представлен при рассмотрении операторов структурного управления.



             Листинг 1-13. Пример расширения обобщенного макро @PushOp
         -----------------------------------------------------------------
            dat_seg SEGMENT
            datq    dq      4040414142424343h
            dat_seg ENDS
                    .
                    .
                    .
            start:
                    @PushOp ax          ;сохранение общего регистра
            1               push   ax
                    @PushOp cs          ;сохранение регистра сегмента
            1               push   cs
                    @PuchOp al          ;сохранение короткого регистра
            2               push   ax...     ;сделать общий регистр
                    @PushOp 01234h      ;сохранить константу
            2               push   bp
            2               mov    bp,sp
            2               push   ax
            2               mov    ax,01234h
            2               xchg   [bp],ax
            2               mov    bp,ax
            2               pop    ax
                    @PushOp  'A'         ;сохранение константы
            2                push   bp
            2                mov    bp,sp
            2                push   ax
            2                mov    ax,'A'
            2                xchg   [bp],ax
            2                mov    bp,ax
            2                pop    ax
                   @PushOp   start     ;сохранить смещение програм.метки
            2                push   bp
            2                mov    bp,sp
            2                push   ax
            2                mov    ax,offset start
            2                xchg   [bp],ax
            2                mov    bp,ax
            2                pop    ax
                   @PushOp   datq       ;сохранить четверную переменную
            2                push   ?argadd         ;1-ое слово
            2                push   ?argadd         ;2-ое слово
            2                push   ?argadd         ;3-ое слово
            2                push   ?argadd         ;4-ое слово
                   .
                   .
                   .
         ----------------------------------------------------------------

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

Hosted by uCoz