Читать «Макросы и директивы компилятора FASM» онлайн - страница 2
Автор неизвестен
Директива purge
позволяет удалить последнее определение макроса. Она используется с одним или более имен макросов разделенных запятыми. Если такого макроса не было определено, никаких ошибок не произойдет. Например, после использования mov
расширенного макросами, определенными выше, Вы можете удалить синтаксис с тремя аргументами, используя директиву purge mov
. Следующий purge mov
удалит также синтаксис для сегментных регистров, но далее такие директивы ничего не сделают.
Если после директивы macro
Вы задаете некоторую группу имен аргументов в квадратных скобках, это позволит использовать большее количество параметров для этой группы аргументов при использовании этого макроса. Любой аргумент, использованный после последнего аргумента такой группы, начнет новую группу и станет её первым аргументом. Именно поэтому после закрытия квадратной скобки нельзя определять аргументов. Содержание макроса будет обработано для каждой такой группы аргументов отдельно. Самый простой пример с одним аргументом в квадратных скобках:
macro stoschar [char]
{
mov al,char
stosb
}
Этот макрос принимает неограниченное количество аргументов, и каждый будет отдельно обработан с этими двумя инструкциями. Для примера stoschar 1,2,3
будет скомпилирован как следующие инструкции:
mov al,1
stosb
mov al,2
stosb
mov al,3
stosb
Есть некоторые специальные директивы, располагаемые только в определениях макросов. Директива local
определяет локальные имена, которые будут заменены новыми значениями каждый раз, когда используется макрос. Она должна сопровождаться именами, отделенными запятыми. Эта директива обычно нужна для констант или меток которые макрос определяет и использует внутри себя. Например:
macro movstr
{
local move
move:
lodsb
stosb
test al,al
jnz move
}
При использовании этого макроса метка move
всегда имеет свое уникальное значение и повторение этого макроса не вызовет ошибок.
Директивы forward
, reverse
и common
делят макрос на блоки, каждый обрабатывается после того, как обработка предыдущих закончена. Они отличаются по поведению, только если макрос позволяет множественные группы аргументов. Блок инструкций, что следует за директивой forward
, будет обработан для каждой группы аргументов с первого до последнего — наподобие обычному блоку (не заданному в соответствии с любой из этих директив). Блок, который следует за директивой reverse
, будет обработан для каждой группы аргумента в обратном порядке — от последнего до первого. Блок, который следует за директивой common
, будет обработан только однажды, сразу для всех групп аргументов. Значение local
, определенное в одном из блоков доступно во всех следующих блоках при обработке той же самой группы аргументов где оно было определено, когда оно определено в блоке common
, оно доступно во всех следующих блоках независимо какая группа аргументов обрабатывается.