пишу набор макрос для разбора выражения [varname:=][object->]func([param1,param2...]) возникают следующие проблемы: 1) в match нет "else" ветви, приходится писать Код (Text): flag=0 match pattern,line { flag=1 (...) } if ~flag (...) end if или Код (Text): repeat 1 match pattern,line { flag=1 (...) break } (...) end repeat 2) проблема с конкатенацией внутри match вот такой код не работает: Код (Text): (...) match obj->met,proc \\{ call [eax+obj#.#met] break \\} \} } а такой работает: Код (Text): macro __call_eax_2 name1,name2 { call [eax+name1#.#name2] } (...) match obj->met,proc \\{ __call_eax_2 obj,met break \\} Можно ли с этим чтото сделать? И где можно найти примеры использования match с описаниями?
Немного на форуме фасма, остальное - в сорцах тех товарищей, которые выкладывали свои эксперименты с сабжем. Код (Text): local flag ; если он действительно нужен match pattern,line { flag equ 1 } match ,line { flag equ 0 } match =1,flag { } ; и т.п. Экранировать # внутри блоков нужно, подробнее читай в справке. Ну и могут понадобиться дополнительные вложения, типа newname = name # label match really_new_name,newname { ; использование полученного имени } Вообще, чтобы более-менее разобраться в написанном и в том, как это понимает фасм, скачай сборку с поддержкой генерации preprocessed listing, там в полученном сорце увидишь раскрутку макросов с промежуточными значениями, очень удобно.
это не "else", а вот это "else" : Код (Text): flag = 0 match pattern,line { flag = 1 (...) } match =0,flag { (...) } как экранировать "#"? в справке про это не написано. Код (Text): newname = name # label match really_new_name,newname { ; использование полученного имени } не работает.
There is more than one way to do the Right Thing. 2.3.3: В общем, смотри примеры макросов в фасме и на форумах. Есть ещё небольшое руководство по макросам, смотри в FAQ'e соответствующего подфорума фасма.