match в fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем GoldFinch, 29 мар 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    пишу набор макрос для разбора выражения
    [varname:=][object->]func([param1,param2...])
    возникают следующие проблемы:

    1) в match нет "else" ветви, приходится писать
    Код (Text):
    1. flag=0
    2. match pattern,line { flag=1
    3. (...)
    4. }
    5. if ~flag
    6. (...)
    7. end if
    или
    Код (Text):
    1. repeat 1
    2. match pattern,line { flag=1
    3. (...)
    4. break }
    5. (...)
    6. end repeat
    2) проблема с конкатенацией внутри match
    вот такой код не работает:
    Код (Text):
    1. (...)
    2.  match obj->met,proc \\{ call [eax+obj#.#met]
    3.                          break \\}
    4. \} }
    а такой работает:

    Код (Text):
    1. macro __call_eax_2 name1,name2 { call [eax+name1#.#name2] }
    2. (...)
    3.  match obj->met,proc \\{ __call_eax_2 obj,met
    4.                          break \\}
    Можно ли с этим чтото сделать?

    И где можно найти примеры использования match с описаниями?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Немного на форуме фасма, остальное - в сорцах тех товарищей, которые выкладывали свои эксперименты с сабжем.

    Код (Text):
    1. local flag ; если он действительно нужен
    2. match pattern,line { flag equ 1 }
    3. match ,line { flag equ 0 }
    4. match =1,flag { }
    5. ; и т.п.
    Экранировать # внутри блоков нужно, подробнее читай в справке. Ну и могут понадобиться дополнительные вложения, типа
    newname = name # label
    match really_new_name,newname { ; использование полученного имени }

    Вообще, чтобы более-менее разобраться в написанном и в том, как это понимает фасм, скачай сборку с поддержкой генерации preprocessed listing, там в полученном сорце увидишь раскрутку макросов с промежуточными значениями, очень удобно.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    это не "else", а вот это "else" :
    Код (Text):
    1. flag = 0
    2. match pattern,line { flag = 1
    3. (...) }
    4. match =0,flag { (...) }
    как экранировать "#"? в справке про это не написано.
    Код (Text):
    1. newname = name # label
    2. match really_new_name,newname { ; использование полученного имени }
    не работает.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    There is more than one way to do the Right Thing.

    2.3.3:
    В общем, смотри примеры макросов в фасме и на форумах. Есть ещё небольшое руководство по макросам, смотри в FAQ'e соответствующего подфорума фасма.