Реклама:

Большинство макропроцессоров поддерживают целый ряд дополнительных функций, которые упрощают работу программиста, пишущего на языке ассемблера. В этом подразделе мы рассмотрим несколько дополнительных функций ассемблера MASM. Для всех ассемблеров характерна проблема: дублирование меток. Предположим, что макрос содержит команду условного перехода и метку, к которой совершается переход. Если макрос вызывается два и более раза, метка будет дублироваться, что вызовет ошибку. Поэтому программист должен приписывать каждому вызову в качестве параметра свою метку. Другое решение (оно применяется в MASM) - объявлять метку локальной (LOCAL), при этом ассемблер автоматически будет порождать другую метку при каждом расширении макроса. В некоторых ассемблерах числовые метки по умолчанию считаются локальными.

MASM и большинство других ассемблеров позволяют определять макросы внутри других макросов. Эта особенность очень полезна в сочетании с условным ассемблированием программы. Обычно один и тот же макрос определятся в обеих ветвях оператора IF:

Ml MACRO

IF WORDSIZE GT 16 M2 MACRO

ENDM ELSE M2 MACRO

ENDM ENDIF ENDM

В любом случае макрос М2 будет определен, но определение зависит от того, на какой машине ассемблируется программа: на 16-разрядной или на 32-разрядной. Если Ml не вызывается, макрос М2 вообще не будет определен.

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

Макросы с параметрами || Оглавление || Реализация макросов в ассемблере