Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 142

Unknown Author

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

Итак, большие фрагменты рекомендуется описывать как процедуры, а маленькие - как макросы.

1 U.6. Определение макроса через макрос

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

Пусть макрос ARR X,N предназначен для описания массива X из N байтов:

ARR MACRO X ,N X DB N DUP(?)

ENDM

Тогда, используя его, можно определить макрос ARR2, предназначенный для описания сразу двух массивов одного и того же размера;

ARR2 MACRO Х1,Х2,К

ARR Х1,<К>

ARR Х2,<К>

ENDM

При таком макроопределении макроподстановка для макроса ARR2 проходит в два этапа, например:

ARR2 А,В,20    ARR А,<20>    A DB 20 DUP(?)

ARR В><20>    В DB 20 DUP(?)

Почему в теле макроса ARR2 при обращении в макросу ARR второй фактический параметр записывается в уголках? Дело в том, что если по смыслу первым и вторым параметрами макроса ARR2 могут быть только имена, то как третий параметр может быть указана достаточно сложная конструкция, например: ARR2 А,В,<25 MOD 10>. Так вот, если бы вместо записи <К> использовалась просто запись К, тогда на первом этапе макроподстановки получилась бы макрокоманда ARR А,25 MOD 10 с четырьмя операндами, а не с двумя (напомним, что при макроподстановке уголки фактического параметра отбрасываются и что в макрокомандах параметры могут отделяться как запятыми, так и пробелами). При записи же <К> уголки заставляют рассматривать эту Конструкцию как один параметр: ARR А,<25 MOD 10>.