Читать «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>.