Flat Assembler 1.64. Мануал программера | страница 18



»:

>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».

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

>macro mov op1,op2

>{

> if op1 in

>  & op2 in

>  push op2

>  pop op1

> else

>  mov op1,op2

>end if

>}

Эта макроинструкция расширяет синтаксис инструкции «>mov», позволяя обоим операндам быть сегментными регистрами. Например, «>mov ds,es» будет ассемблировано как «>push es» и «>pop ds». Во всех других случаях будет использована стандартная инструкция «>mov». Синтаксис этого «