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

Unknown Author

Примеры (над стрелкой указано, какие формальные параметры на какие фактические параметры заменяются):

Х-»А, Y->ES:B

SUM A,ES:B    --^    MOV AX,ES:B

ADD A,AX

NM-> , TP->W, VL-»1,2

VAR ,W,<1,2>    --^ DW 1,2

В общем случае макрокоманда заменяется на несколько команд, т. е. она как бы представляет собой целую группу команд. Этим и объясняется название "макрокоманда" - "большая команда".

11 «3.4. Примеры использования макросов

Пример 1 (описание крупных операций в виде макросов)

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

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

Пусть, к примеру, в нашей программе многократно встречается условный переход "по меньше": if х<у then goto L. Эта операция реализуется тремя командами. Чтобы их каждый раз не выписывать заново, имеет смысл описать их как макрос, а затем пользоваться им. Давайте так и сделаем. Дадим этому макросу имя if_less и будем считать, что числа у нас знаковые и размером в слово:

IF«JLESS MACRO X,Y,L

MOV AX,X CMP AX,Y JL L ENDM

Имея такой макрос, можно, к примеру, следующим образом описать вычисление минимума трех чисел DX=min(A,B,C):

MOV DX,A    MOV DX,A

IF_LESS A,B,M1 -1    x —> A, Y -> B, L -> Ml    MOV AX,A

MOV DX,B    1--—---^ CMP AX,В

Ml: IF_LESS DX,C,M2 -«    JL Ml

MOV DX,C    MOV DX,B

М2: ...    Ml:

| X —> DX, Y -> C, L -> М2,    MOv AX,DX

^ CMP AX,C

JL М2 MOV DX,C

М2: ...

Слева указан текст программы, который составляет ее автор, а справа - те команды, которые будет реально выполняться. (Замечание: если макрокоманда помечена меткой, то в макрорасширении эта метка размещается в отдельной строке, а тело макроса начинается со следующей строки, т. к. в общем случае первая команда тела макроса может быть помечена своей меткой.)

Как видно, использование макросов сокращает размеры исходного текста программы и, что не менее важно, позволяет составлять программу в терминах более крупных операций. Если в виде макросов описать все часто используемые операции, то мы фактически построим новый язык, программировать на котором существенно проще, чем на "чистом” ЯА.

Пример 2 (макросы и обращения к процедурам)