Макросы и директивы компилятора FASM | страница 4



:

>macro invoke proc,[arg]

> { >common >stdcall [proc],arg >}

Это может использоваться, чтобы вызывать косвенно (по указателю, находящемуся в памяти) процедуру, используя соглашение STDCALL.

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

>macro jif op1,cond,op2,label

> {

>      cmp op1,op2

>      j#cond label

> }

К примеру >jif ax,ae,10h,exit будет скомпилировано как >cmp ax,10h и >jae exit.

Чтобы сделать макрос, ведущий себя в зависимости от типа аргумента, когда аргументы — строки или нет, Вы может использовать факт, что ассемблер отличает напрямую указанные строки от указанных строк в численных выражениях, но не отличает численное выражение, которому предшествуют знак >+ от того же самого выражения без знака. Так строка, которой предшествуют >+ со знаком будут обрабатывать как численное выражение и не будет символически равен той же самой строке без любого знака, в то время как любая другая величина будет символически равна тому же самому выражению, которому предшествуют >+ знак. Вот пример макроса, использующий эту особенность:

>macro message arg

> {

>  if arg eq +arg

>      mov dx,arg

>  else

>      local str

>      jmp @f

>      str db arg,0Dh,0Ah,24h

>      @@:

>      mov dx,str

>  end if

>      mov ah,9 int 21h

> }

Этот макрос показывает сообщения в ДОС программах. Когда аргумент этого макроса — некоторая метка, отображается строка с этого адреса, но когда аргумент — указанная строка, создается код правильно обрабатывающий эту строку.


Структуры

Директива >struc — специальный вариант макро-директивы, которая используется, чтобы задавать структуры данных. Макрос, заданный директивой >struc должен быть предварительно задан меткой (как при определении данных). Эта метка будет также содержаться в начале каждого имени, начинающегося с точки в содержании макроса.

Макрос, определенный с помощью директивы >struc может носить тоже имя, что и макрос, определенный с помощью директивы macro. Макрос структуры не предотвращает обработку обычного макроса, когда перед ним нет метки и наоборот.

Все правила относительно стандартных макрокоманд относятся и к макросам структур.

Вот пример структуры:

>struc point x,y

> {

>      .x dw x

>      .y dw y

> }

Например >my point 7,11 определит структуру, с меткой