макросы для ифов в fasm

Тема в разделе "WASM.ASSEMBLER", создана пользователем human45, 12 фев 2007.

  1. human45

    human45 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    18
    на днях пытался разобратся в макросах IF.inc в fasm-е так вот
    многвложенный вызов уже реализован автором проекта а вот сделать например так вот
    .if <stdcall p1,<stdcall p2>> < <stdcall p3,23,12>
    ..
    .endif
    нельзя так как макрос плюет на то что там в треугольных скобках он просто отсекает по первой запятой и говорит что мол то что до нее это первый операнд то что между первой и второй это второй оп-д и так далее ну дак это и понятно он же строку то обрабатывает строчно если так сказать можно.
    короче перекроить стандартный макрос - дело мягко говоря сложное проще сделать новый по образу и подобию старого , ну или типа того что-то, короче нет где готовых гигантов для таких задач глобальных?? сам я это если сделаю то года наверно через два
    спасибо!!
     
  2. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Простейшее решение аналогичной задачи в C++ - объявить макрос "запятая" и использовать его :)
     
  3. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Да, в С++ такое возникает, когда в макрос передаётся шаблон, например:

    COOL_MACRO(std::map<int, int>) - запятая будет трактоваться препроцессором как запятая между параметрами.

    #define COMMA ,

    COOL_MACRO(std::map<int COMMA int>) - работает

    #define WRAPPER(x, y) x, y

    COOL_MACRO(WRAPPER(std::map<int, int>)) - тоже работает
     
  4. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Ну ёперный бабай! Сначала не редактировалось, пришлось новое писать, написал - а старое оказывается незаметно отредактировалось... Не, редактирование сообщений это явно от лукавого.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Дабы не поднимать новую тему, а более подходящей не нашел. Так вот попробовал написать что-нибудь на макросах fasm'а. Конкретно .for. Если кому интересно, код (если можно это так назвать) ниже. Просьба потестить и высказаться :)
    Использование:
    .for (statement1, statement2,... : condition1 [&|^] condition2... : statement1, statement2,...)
    ; Тело цикла. Допускается вложенность циклов.
    .endfor

    Ограничения:
    - statements - простейшие выражения типа eax=ebx, eax++, eax<<cl и т.п. Т.е. никаких умножений, делений и прочей лабуды; если надо - добавить я думаю не проблема
    - conditions - тот же синтаксис что и для стандартных if-while-repeat;
    - отсутствует break (только что про него вспомнил, поэтому нету :) );
    - требует включения 'macro\if.inc';
    - не знаю что происходит при ошибках программиста в синтаксисе...;
    - еще что-нибудь.
    Пример использования:
    Код (Text):
    1. .for (eax=0, ebx=[base], edx=[ordword]: eax < 10: [ebx+eax*4] |= edx, eax++)
    2. ; some code may be placed here
    3. .endf
    Прошу обратить внимание на то, что разделителями м/у statement'ами и condition'ами является ДВОЕТОЧИЕ, а не точка с запятой по понятным причинам.

    Вот собсно он сам:
    Код (Text):
    1. macro JCOND label,v1,c,v2
    2. {
    3.  match any,c
    4.  \{
    5.    cmp v1,v2
    6.    j\#c label
    7.  \}
    8.  match ,c
    9.  \{
    10.    PARSECOND parsed@cond,v1
    11.    match cond,parsed@cond \\{ JCONDEXPR label,cond \\}
    12.  \}
    13. }
    14.  
    15. macro   .for [args]
    16. {
    17.  common
    18.   local ..for
    19.   __FOR equ ..for
    20.   local ..endfor
    21.   __ENDFOR equ ..endfor
    22.  
    23.   macro for_expr [argsa]
    24.   \{
    25.    cont = 1
    26.    if cont
    27.     match arg=+==val, argsa \\{
    28.     add arg, val
    29.     cont = 0\\}
    30.    end if
    31.    if cont
    32.     match arg=-==val, argsa \\{
    33.     sub arg, val
    34.     cont = 0\\}
    35.    end if
    36.    if cont
    37.     match arg=--, argsa \\{
    38.     dec arg
    39.     cont = 0\\}
    40.    end if
    41.    if cont
    42.     match arg=++, argsa \\{
    43.     inc arg
    44.     cont = 0\\}
    45.    end if
    46.    if cont
    47.     match arg=<<val, argsa \\{
    48.     shl arg, val
    49.     cont = 0\\}
    50.    end if
    51.    if cont
    52.     match arg=>>val, argsa \\{
    53.     shr arg, val
    54.     cont = 0\\}
    55.    end if
    56.    if cont
    57.     match arg=|==val, argsa \\{
    58.     or arg, val
    59.     cont = 0\\}
    60.    end if
    61.    if cont
    62.     match arg=&==val, argsa \\{
    63.     and arg, val
    64.     cont = 0\\}
    65.    end if
    66.    if cont
    67.     match arg=^==val, argsa \\{
    68.     xor arg, val
    69.     cont = 0\\}
    70.    end if
    71.    if cont
    72.     match arg==val, argsa \\{
    73.     mov arg, val
    74.     cont = 0\\}
    75.    end if
    76.   \}
    77.  
    78. define current args
    79.  
    80.   match =(a=:b=:c=), current
    81.   \{
    82.     for_expr a
    83.     JNCOND __ENDFOR, b
    84.   \}
    85.   __FOR:
    86.  
    87.   macro .endf
    88.   \{
    89.     match =(a=:b=:c=), current
    90.     \\{
    91.       for_expr c
    92.       JCOND __FOR, b
    93.       __ENDFOR:
    94.       restore __FOR
    95.       restore __ENDFOR
    96.       restore current
    97.     \\}
    98.   \}
    99. }
     
  6. IceStudent

    IceStudent Active Member

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

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    KeSqueer
    с виду довольно интерестно...
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Добавил .continue, .break, .break.if, .continue.if
    Немного поправил, вроде пограмотнее стало.
    Планирую добавить, точнее отменить проверку начального условия перед циклом, если оно заведомо выполняется. Но тут грабли.

    Код (Text):
    1. macro JCOND label,v1,c,v2
    2. {
    3.  match any,c
    4.  \{
    5.    cmp v1,v2
    6.    j\#c label
    7.  \}
    8.  match ,c
    9.  \{
    10.    PARSECOND parsed@cond,v1
    11.    match cond,parsed@cond \\{ JCONDEXPR label,cond \\}
    12.  \}
    13. }
    14.  
    15. macro   .for [args]
    16. {
    17.  common
    18.   local ..for
    19.   local ..endfor
    20.   local ..continue
    21.   __FOR equ ..for
    22.   __ENDFOR equ ..endfor
    23.   __CONTINUE equ ..continue
    24.  
    25.   macro for_expr [argsa]
    26.   \{
    27.     \local cont
    28.     match =cont arg=+==val, cont argsa \\{
    29.       add arg, val
    30.       define cont \\}
    31.     match =cont arg=-==val, cont argsa \\{
    32.       sub arg, val
    33.       define cont \\}
    34.     match =cont arg=--, cont argsa \\{
    35.       dec arg
    36.       define cont \\}
    37.     match =cont arg=++, cont argsa \\{
    38.       inc arg
    39.       define cont \\}
    40.     match =cont arg=<<val, cont argsa \\{
    41.       shl arg, val
    42.       define cont \\}
    43.     match =cont arg=>>val, cont argsa \\{
    44.       shr arg, val
    45.       define cont \\}
    46.     match =cont arg=|==val, cont argsa \\{
    47.       or arg, val
    48.       define cont \\}
    49.     match =cont arg=&==val, cont argsa \\{
    50.       and arg, val
    51.       define cont \\}
    52.     match =cont arg=^==val, cont argsa \\{
    53.       xor arg, val
    54.       define cont \\}
    55.     match =cont arg==val, cont argsa \\{
    56.       mov arg, val
    57.       define cont \\}
    58.   \}
    59.  
    60.   current equ args
    61.  
    62.   match (a:b:c), current
    63.   \{
    64.     for_expr a
    65.     JNCOND __ENDFOR, b
    66.   __FOR:
    67.   \}
    68.  
    69.   macro .break
    70.   \{
    71.     jmp __ENDFOR
    72.   \}
    73.  
    74.   macro .continue
    75.   \{
    76.    jmp __CONTINUE
    77.   \}
    78.  
    79.   macro .break.if [break_expr]
    80.   \{
    81.     JCOND __ENDFOR, break_expr
    82.   \}
    83.  
    84.   macro .continue.if [cont_expr]
    85.   \{
    86.     JCOND __CONTINUE, cont_expr
    87.   \}
    88.  
    89.   macro .endf
    90.   \{
    91.     __CONTINUE:
    92.     match (a:b:c),current
    93.     \\{
    94.       for_expr c
    95.       JCOND __FOR, b
    96.     \\}
    97.     __ENDFOR:
    98.     restore __FOR
    99.     restore __CONTINUE
    100.     restore __ENDFOR
    101.     restore current
    102.   \}
    103. }