|
Что касается обработки стека (как в @PushIm и
@PushImOff), макросы способны выполнять эти операции без "угро-
зы" влияния команды CALL на стек. Это особенно важно при переме-
щении или изъятии данных из стека, так как подпрограмма не может
изменить вершину стека и осуществить возврат, не вызвав серьезных
осложнений.
Некоторые предупреждения
по использованию условного ассемблирования
и макросов в MASM
Применяя макросы, мы старались забыть, что они вырабатывают
- 1-30 -
построчный код и не вызывают программ. |
win rar |
|
{img2} |
avast 4 professional |
|
Хотя это и представляет
некоторые преимущества при быстрой генерации программного кода и
освобождает нас от ограничений по использованию стека, результа-
том линейной программы является более объемный код. Как програм-
мист, Вы должны решить, когда целесообразно вызывать быстро рабо-
тающее макро, а когда - подпрограмму, экономящую память, но
имеющую разветвленную структуру. |
резервное копирование данных |
|
|
В общем случае используйте мак-
ро, когда программный код невелик, а время критично, или когда Вы
хотите конфигурировать программу, настроив ее на конкретные усло-
вия. Используйте подпрограмму, когда программный код велик и его
нужно расположить в одном месте (так, чтобы его можно было легко
изменить).
Другим тонким моментом работы макро является использование
символов. |
резервное копирование данных |
|
|
резервное копирование, прокси сервера, dr web, win zip, утилиты резервного копирования, .
архиватор winzip
|
Макро
@PushImOff приведено в Листинге 1-12.
- 1-29 -
Листинг 1-12. Макро продвижения в стек смещения
непосредственных данных - @PushImOff
---------------------------------------------------------------
;; **** @PushImOff макро продвижения смещения непосред.данных
@PushImOff MACRO arg
.XALL
рush bp ;;сохранить указатель базы
mov bp,sp ;;переместить указатель стека в BP
push ax ;;сохранить накопитель
mov ax,offset &arg ;;получить смещение
;;непосред.данных
xchg [bp],ax ;;обменять старый BP и непоср.данные
mov bp,ax ;;восстановить старый BP из AX
pop ax ;;восстановить накопитель
.SALL
ENDM ;;конец макроописания
----------------------------------------------------------------
Последним дискретным случаем, который распознает @PushOp, яв-
ляется попытка прямого проталкивания в стек данных памяти. Слож-
ность в этом случае заключается в том, что стек воспринимает
только 16-битовые данные. Используя директиву перекрытия PTR,
можно убедить MASM сохранять нужные данные пословно. @PushOp со-
держит цикл, который повторяет эту операцию для каждого слова
сохраняемых данных, увеличивая адрес на два при каждом проходе
цикла. Таким образом можно сохранять в стеке двойные слова, чет-
верные слова, 10-байтовые данные и структуры данных.
Наконец, заметим, что макро @PushOp все еще не обрабатывает
ссылки, содержащие сложную адресацию (2[BP] и т.д.). В случае не-
обходимости Вы можете применить подобные проверки, используя мак-
родирективу IRPC для выявления в аргументах квадратных скобок,
адресации "база + индекс" и "база + смещение".
Итоговый тест макро @PushOp приведен в Листинге 1-13, который
содержит результат нескольких вызовов макро @PushOp.
Последняя операция листинга, где @PushOр обрабатывает 4-слов-
ную переменную, не может быть изъята. Каждое проталкивание имеет
один и тот же аргумент. Однако из этого красивого листинга не
видно, что каждая его строка имеет перемещаемый адрес (0000 для
первого слова, 0002 для второго и т.д.). К сожалению, мы не можем
в данной книге привести 132-колоночные листинги, и, если Вы хоти-
те проверить, попробуйте получить такой листинг сами.
Этот пример особенно полезен тем, что демонстрирует одну об-
ласть, где применение макро почти всегда предпочтительнее приме-
нения подпрограмм.
|
|
|