34. Операции, используемые в макроопределениях

Оператор подстановки (&)
Этот оператор предписывает препроцессору заменить в макроопределении имя параметра на его значение.

К примеру, напишем макроопределение для суммирования двух чисел заранее не известного размера, тогда очевидно, что внутри макроопределения нужно как-то определить строковую переменную, содержащую имя регистра. Поэтому мы должны добавить перед именем параметра оператор &. Тогда препроцессор подставит в строковый литерал вместо него значение переданного аргумента (например “L”).

;макроопредление
SUM MACRO n,m,p,q
;;p=n+m, q - type
push a&q

mov a&q, n
add a&q, m
mov p, a&q
pop a&q


;вызов
x db 2
y db 5
z db ?

sum x,y,z,l

Символ & можно использовать для распознавания форм аргумента внутри строки заключенной в кавычки.


Оператор выражения (%)
Этот оператор предназначен для выполнения замещения текстовых макросов и преобразования значения константных выражений в их текстовое представление. Подобное преобразование может выполняться несколькими способами.

При использовании в директиве ТЕХТQ оператор % предписывает препроцессору вычислить значение константного выражения и преобразовать полученный целочисленный результат в эквивалентное текстовое значение.
В приведенном ниже примере с помощью оператора % вычисляется значение выражения (5 + count) и полученное значение 15 преобразовывается в текст:

Count : = 10
sumVal ТЕХТЕQ  % (5 + count) ; = 15

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

;макроопределение
TEST MACRO p1, p2
DB p1
DB p2

....
S = 10
R = 20
….
;вызов без оператора %
TEST S,R
;сгенерированные строки
db S
db R
;вызов с оператором %
TEST %S, %R
;в сгенерированных строках значения S и R были вычислены
db 10
db 20

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

Предположим, например, что нам нужно отобразить на экране во время компиляции программы размер массива аггау.
Чтобы достичь поставленной цели, воспользуемся директивой ТЕХТЕQ и создадим текстовый макрос, содержащий выражение % (SIZEOF аrrау). 
Затем в следующей строке с помощью оператора % выполним замещение этого макроса:
TempStr TEXTEQ %(3SIZEOF аrreу)
% ЕСНО Длина массива аrrау составляет TempStr байтов 
Тогда на экране вы увидите следующее:
Длина массива аrrау составляет 32 байтов


Оператор выделения текста (<>)
Данный оператор позволяет сгруппировать один или несколько символов в единый строковый литерал. При его обработке препроцессор воспринимает заключенный в угловые скобки текст как один элемент и не интерпретирует его содержимое, например, не разбивает список аргументов, разделенных запятой, на отдельные элементы. Оператор выделения текста используется, если в строке содержатся специальные символы, такие как запятая, знак процента (%), амперсанд (&) и точка с запятой (;), которые не должны быть восприняты препроцессором как символы-разделители или знаки операции.

Оператор выделения символа (!)
Этот оператор очень похож по смыслу на оператор выделения текста, только область его действия распространяется на один символ. Препроцессор воспринимает следующий за восклицательным знаком символ как обычный текстовый символ и не интерпретирует его.
В приведенном ниже определении текстового макроса BadValue оператор ! используется для выделения символа “>”, чтобы он не воспринимался препроцессором как служебный:

BadValue TEXTEQU <Внимание координата Y!> 24 >
17.07.2015