«restore
restore d» после предыдущего переопределения вернет константе значение «edx», следующее применение этой директивы вернет ей значение «dword», а ещё одно применение восстановит первоначальное значение, как будто такая константа не определялась. Если не константа с заданным именем не определена, то «restore» не вызовет ошибку, а будет просто проигнорирована.Символьные константы могут использоваться для адаптации синтаксиса ассемблера к персональным предпочтениям. Например, следующие определения создают удобные ярлыки для всех операторов размера:
b equ byte
w equ word
d equ dword
p equ pword
f equ fword
q equ qword
t equ tword
x equ dqword
Так как символьная константа может так же иметь пустое значение, она может использоваться для того, чтобы допустить синтаксис со словом «offset
offset equ
После такого определения «mov ax, offset char
char» в регистр «ax», так как «offset» заменяется пустым значением, и поэтому игнорируется.Символьные константы могут также быть определены директивой «fix
equ», но определяет константы высшего приоритета — они заменяются их символическим значением даже перед совершением директив препроцессора и макроинструкций. Исключением является сама директива «fix», которая имеет наивысший возможный приоритет, и поэтому допускает переопределение констант, заданных таким путем. Но если такие константы высшего приоритета находятся внутри значения, следующего за директивой «fix», они заменяются их значениями перед присвоением этого значения новой константе.Директива «fix
equ». Например:incl fix include
определяет короткое имя для директивы «include
equ» не даст такого результата, так как стандартные символьные константы заменяются на из значения после поиска строк с директивами препроцессора.2.3.3 Макроинструкции
«macro
test al,0xFF»:macro tst {test al,0xFF}
После директивы «macro
{» и «}». Вы можете использовать инструкцию «tst» в любом месте после её определения и она будет ассемблирована как «test al,0xFF». Определение символьной константы с таким значением даст похожий результат, различие лишь в том, что имя макроинструкции будет распознаваться только как мнемоник инструкции. Также, макроинструкции заменяются соответствующим кодом даже перед заменой символьных констант на их значения. То есть, если вы вы определите макроинструкцию и символьную константу под одним и тем же именем и используете это имя как мнемоник инструкции, оно будет заменено на содержание макроинструкции, но если вы используете его внутри операндов, имя будет заменено на значение символьной константы.Определение макроинструкции может сотоять из нескольких строк, потому что знаки «{
}» не обязательно должны находиться на одной строке директивой «macro». Например:macro stos0
{
xor al,al
stosb
}
Макроинструкция «stos0
Как и инструкции, которым требуются несколько операндов, для макроинструкции можно задать требование нескольких аргументов, разделяя их запятыми. Имена этих аргументов должны следовать за именем макроинструкции на строке с директивой «macro
macro align value { rb (value-1)-($+value-1) mod value }
Когда инструкция «align 4
value» станет 4, а результат будет «rb (4–1)-($+4–1) mod 4».