в первой строк директива FIX
EQU
на =
. Далее, перед обработкой следующей строки, препроцессор проверит, нет ли там пофиксеных идентификаторов. Так что в нашей второй строке equ
будет заменено на =
, и строка примет вид a = 10
. Так что никакой другой обработки этой строки не будет выполнено. А значит, и третья строка не будет преобразовываться препроцессором, так как идентификатор a не будет определён директивой EQU
. Результат всего этого будет такой:a = 10
mov ax, a
Директива FIX
macro declare_macro_AAA
{
macro AAA
%_
db 'aaa',0
_%
}
%_ fix {
_% fix }
declare_macro_AAA
Здесь, препроцессор найдёт объявление макроса declare_macro_AAA
FIX
, и потом использование макроса declare_macro_AAA
. Так что он преобразует это в:macro declare_macro_AAA
{
macro AAA
%_
db 'aaa',0
_%
}
%_ fix {
_% fix }
macro AAA
%_
db 'aaa',0
_%
и теперь уже содержимое нового макроса будет обработано препроцессором. Далее будут заменены аргументы FIX
macro declare_macro_AAA
{
macro AAA
%_
db 'aaa',0
_%
}
macro AAA
{
db 'aaa',0
}
как мы и хотели.
Подобным образом можно пофиксить все остальные проблематичные вещи:
macro declare_macro_TEXT
{
macro TEXT [arg]
%_
%forward
db %x arg
_%
}
%_ fix {
_% fix }
%forward fix forward
declare_macro_TEXT
%x fix `
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
Заключение
Не забывайте читать документацию FASM. Практически всё, что есть в туториале, можно найти там. Может быть написано и немного сложнее для изучения, но лучше подойдёт в качестве справочной информации. Не так сложно запомнить — 99 % пользователей FASM научились его использовать по этой документации и при помощи форума.