на днях пытался разобратся в макросах IF.inc в fasm-е так вот многвложенный вызов уже реализован автором проекта а вот сделать например так вот .if <stdcall p1,<stdcall p2>> < <stdcall p3,23,12> .. .endif нельзя так как макрос плюет на то что там в треугольных скобках он просто отсекает по первой запятой и говорит что мол то что до нее это первый операнд то что между первой и второй это второй оп-д и так далее ну дак это и понятно он же строку то обрабатывает строчно если так сказать можно. короче перекроить стандартный макрос - дело мягко говоря сложное проще сделать новый по образу и подобию старого , ну или типа того что-то, короче нет где готовых гигантов для таких задач глобальных?? сам я это если сделаю то года наверно через два спасибо!!
Да, в С++ такое возникает, когда в макрос передаётся шаблон, например: 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>)) - тоже работает
Ну ёперный бабай! Сначала не редактировалось, пришлось новое писать, написал - а старое оказывается незаметно отредактировалось... Не, редактирование сообщений это явно от лукавого.
Дабы не поднимать новую тему, а более подходящей не нашел. Так вот попробовал написать что-нибудь на макросах 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): .for (eax=0, ebx=[base], edx=[ordword]: eax < 10: [ebx+eax*4] |= edx, eax++) ; some code may be placed here .endf Прошу обратить внимание на то, что разделителями м/у statement'ами и condition'ами является ДВОЕТОЧИЕ, а не точка с запятой по понятным причинам. Вот собсно он сам: Код (Text): macro JCOND label,v1,c,v2 { match any,c \{ cmp v1,v2 j\#c label \} match ,c \{ PARSECOND parsed@cond,v1 match cond,parsed@cond \\{ JCONDEXPR label,cond \\} \} } macro .for [args] { common local ..for __FOR equ ..for local ..endfor __ENDFOR equ ..endfor macro for_expr [argsa] \{ cont = 1 if cont match arg=+==val, argsa \\{ add arg, val cont = 0\\} end if if cont match arg=-==val, argsa \\{ sub arg, val cont = 0\\} end if if cont match arg=--, argsa \\{ dec arg cont = 0\\} end if if cont match arg=++, argsa \\{ inc arg cont = 0\\} end if if cont match arg=<<val, argsa \\{ shl arg, val cont = 0\\} end if if cont match arg=>>val, argsa \\{ shr arg, val cont = 0\\} end if if cont match arg=|==val, argsa \\{ or arg, val cont = 0\\} end if if cont match arg=&==val, argsa \\{ and arg, val cont = 0\\} end if if cont match arg=^==val, argsa \\{ xor arg, val cont = 0\\} end if if cont match arg==val, argsa \\{ mov arg, val cont = 0\\} end if \} define current args match =(a=:b=:c=), current \{ for_expr a JNCOND __ENDFOR, b \} __FOR: macro .endf \{ match =(a=:b=:c=), current \\{ for_expr c JCOND __FOR, b __ENDFOR: restore __FOR restore __ENDFOR restore current \\} \} }
KeSqueer Неплохо и довольно грамотно. Потестить пока не могу, но может пригодится когда. Покажи на форуме фасма, если ещё не постил там.
Добавил .continue, .break, .break.if, .continue.if Немного поправил, вроде пограмотнее стало. Планирую добавить, точнее отменить проверку начального условия перед циклом, если оно заведомо выполняется. Но тут грабли. Код (Text): macro JCOND label,v1,c,v2 { match any,c \{ cmp v1,v2 j\#c label \} match ,c \{ PARSECOND parsed@cond,v1 match cond,parsed@cond \\{ JCONDEXPR label,cond \\} \} } macro .for [args] { common local ..for local ..endfor local ..continue __FOR equ ..for __ENDFOR equ ..endfor __CONTINUE equ ..continue macro for_expr [argsa] \{ \local cont match =cont arg=+==val, cont argsa \\{ add arg, val define cont \\} match =cont arg=-==val, cont argsa \\{ sub arg, val define cont \\} match =cont arg=--, cont argsa \\{ dec arg define cont \\} match =cont arg=++, cont argsa \\{ inc arg define cont \\} match =cont arg=<<val, cont argsa \\{ shl arg, val define cont \\} match =cont arg=>>val, cont argsa \\{ shr arg, val define cont \\} match =cont arg=|==val, cont argsa \\{ or arg, val define cont \\} match =cont arg=&==val, cont argsa \\{ and arg, val define cont \\} match =cont arg=^==val, cont argsa \\{ xor arg, val define cont \\} match =cont arg==val, cont argsa \\{ mov arg, val define cont \\} \} current equ args match (a:b:c), current \{ for_expr a JNCOND __ENDFOR, b __FOR: \} macro .break \{ jmp __ENDFOR \} macro .continue \{ jmp __CONTINUE \} macro .break.if [break_expr] \{ JCOND __ENDFOR, break_expr \} macro .continue.if [cont_expr] \{ JCOND __CONTINUE, cont_expr \} macro .endf \{ __CONTINUE: match (a:b:c),current \\{ for_expr c JCOND __FOR, b \\} __ENDFOR: restore __FOR restore __CONTINUE restore __ENDFOR restore current \} }