3.5. Макроопределения

Одно из самых мощных языковых средств ассемблера - макроопределения. Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой MACRO и заканчи­вается ENDM. Например: пусть описано макроопределение hex2ascii, переводя­щее шестнадцатеричное число, находящееся в регистре AL, в ASCII-код соответ­ствующей шестнадцатеричной цифры:

hex2ascii

cmp

sbb das macro al,10 al,69h

endm

Сейчас в программе можно использовать слово hex2ascii, как если бы это было имя команды, и ассемблер заменит каждое такое слово на три команды, содер­жащиеся в макроопределении. Разумеется, можно оформить этот же участок кода в виде процедуры и вызывать его командой CALL - если процедура вызывается больше одного раза, этот вариант программы займет меньше места, но вариант с макроопределением станет выполняться быстрее, так как в нем не будет лиш­них команд CALL и RET. Однако скорость выполнения - не главное преимуще­ство макросов. В отличие от процедур макроопределения могут вызываться с параметрами, следовательно, в зависимости от ситуации, включаемый код бу­дет немного различаться, например:

sjnov macro     register"!, register2

push registerl pop register2 endm

Теперь можно использовать S_MOV вместо команды MOV для того, чтобы скопировать значение из одного сегментного регистра в другой.

Следующее важное средство, использующееся в макроопределениях, - дирек­тивы условного ассемблирования. Например: напишем макрос, выполняющий

умножение регистра АХ на число, причем, если множитель - степень двойки, то умножение будет выполняться более быстрой командой сдвига влево.

fast mul

 

macro

литЬег

 

if

number

eq 2

 

 

shl

ах, 1

; Умножение на 2.

elseif

number

eq 4

 

 

shl

ax,2

; Умножение на 4.

elseif

number

eq 8

 

 

shl

ax,3

; Умножение на 8.

; Аналогично вплоть до:

elseif

number

eq 32768

 

 

shl

ax, 15

Умножение на

else ■

 

 

 

 

fflov

dx,number

; Умножение на число, не являющееся

 

raul

dx

; степенью двойки.

endif

endm

 

 

Макроопределения

Можно, конечно, усложнить этот макрос, применяя особые свойства команды LEA и ее комбинации, сдвиги и сложения, однако в нынешнем виде он чрезмерно громоздкий. Проблема решается с помощью третьего средства, постоянно исполь­зующегося в макросах, - блоков повторений.