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