>TEXT abc,def
В этом примере нужно обратить внимание на один момент: строка >%x fix `
должна находиться после >declare_macro_TEXT
. Если б она находилась до, то >%x
было бы пофиксено во время развёртывания макроса, и тогда >`arg
приняло бы вид >'arg'
, следовательно макрос >TEXT
был бы объявлен так:
>macro TEXT [arg]
>{
> forward
> db 'arg' ;строка не зависит от аргументов
>}
Но, в нашем случае он будет:
>macro TEXT [arg]
>{
> forward
> db `arg ;имена аргументов превращаются в строки
>}
Этот пример показывает, как важно местонахождение >FIX
.
Иногда необходимо фиксить идентификаторы дважды:
>macro m1
>{
> macro m2
> %_
> macro m3 [arg]
> %%_
> db arg
> _%%
> _%
>}
>%%_ fix %_
>_%% fix _%
>%_ fix {
>%_ fix }
>m1
>m2
>m3
Символы фиксятся даже во время препроцессинга других >FIX
, так что код выше не будет работать, если порядок будет такой:
>%_ fix {
>%_ fix }
>%%_ fix %_
>_%% fix _%
В этом случае строка >%%_ fix %_
была бы пофиксена сразу же после >%_ fix {
, так что все последующие >%%_
сразу же преобразовались бы в >}
. То же самое и для >_%% fix _%
.
Я знаю, >FIX
ы могут смутить, и хорошо бы понимать внутренние детали работы препроцессора, но они предоставляют очень большие возможности. Privalov делает FASM настолько мощным, на сколько это возможно, даже за счёт некоторого ущерба удобопонятности.
Не забывайте читать документацию FASM. Практически всё, что есть в туториале, можно найти там. Может быть написано и немного сложнее для изучения, но лучше подойдёт в качестве справочной информации. Не так сложно запомнить — 99 % пользователей FASM научились его использовать по этой документации и при помощи форума.