33. Параметры макрокоманды и макроопределения. Макрофункция

Обычно макрокоманда содержит некоторый список аргументов — список_фактических_аргументов, которыми корректируется макроопределение. Места в теле макроопределения, которые будут замещаться фактическими аргументами из макрокоманды, обозначаются с помощью так называемых формальных аргументов. Таким образом, в результате применения макрокоманды в программе формальные аргументы в макроопределении замещаются соответствующими фактическими аргументами; в этом и заключается учет контекста.

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

Нужно особо отметить список_формальных_аргументов в заголовке макроопределения. В общем случае он содержит не только перечисление формальных аргументов через запятую, но и некоторую дополнительную информацию. Полный синтаксис формального аргумента следующий:

имя_формального_аргумента[:тип]

где тип может принимать значения:

  • REQ, которое говорит о том, что требуется обязательное явное задание фактического аргумента при вызове макрокоманды;
  • =<любая_строка> — если аргумент при вызове макрокоманды не задан, то в соответствующие места в макрорасширении будет вставлено значение по умолчанию, соответствующее значению любая_строка.
  • Будьте внимательны: символы, входящие в любая_строка, должны быть заключены в угловые скобки.



Макрофункции
Так же как и при обработке макропроцедуры, при обработке макрофункции препроцессор подставляет вместо ее имени набор ассемблерных команд, единственное отличие состоит в том, что она всегда возвращает константу(целую или строковую) в вызывающею ее программу с помощью директивы EXITM, которая немедленно прекращает дальнейшую обработку макроопределения. При вызове макрофункции список ее аргументов следует заключить в круглые скобки.
Пример макрофункции возвращающей значение 1, если переданное символьное имя определено и 0 в противном случае:

; определение 
IS_DEFINE MACRO symbol
	IFDEF symbol
		EXITM 1
	ELSE EXITM 0
	ENDIF
ENDM
; вызов
IF IS_DEFINE (RealMode)
	MOV ax, dseg
	MOV ds, ax
ENDIF

17.07.2015