Макросы и директивы компилятора 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
определит структуру, с меткой