Вот замутил несколько макросов - continue, continueif, break, breakif, JCOND. JCOND - это "инверсия" от макроса JNCOND в файле if.inc continue, continueif, break, breakif - используются внутри цикла while. Странно, в масме эти дериктивы есть а фасме нету! Теперь хотелось бы сделать SWITCH как в С++ У кого есть какие соображения? Код (Text): ; Macroinstructions for HLL-style conditional operations macro .continue { jmp __WHILE } macro .continueif [arg] { JCOND __WHILE,arg } macro .break { jmp __ENDW } macro .breakif [arg] { JCOND __ENDW,arg } 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 \\} \} }
Нашёл. Кому интересно: http://board.flatassembler.net/topic.php?t=3768 И почему Гриштар не соберёт все путёвые макросы в свой fasm... :/
hypers, потому что ему нафиг не нужен геморрой с вопросами почему не работает и как этим пользоваться
hypers Avoidik прав. Плюс то, что макросы можешь менять как хочешь, да и препроцессор меняется. Нет смысла поддерживать старьё. По поводу выбранной тобой реализации - она не хорошая, использовать её лучше когда значения в case не очень отличаются друг от друга, иначе сгенерированная таблица будет слишком большой. Была другая, обычная, без таблицы.
Предлагаю обсудить такой вариант Код (Text): macro switch var { local tableval, tablejmp, done, size if ~ var eq eax mov eax,var end if mov ecx, size mov edi, tableval repne scasd not ecx jmp dword [tablejmp + 4 * size + 4 * ecx] tableval dd size dup ? tablejmp dd size dup $ local cnt cnt = 0 macro case value \{ virtual dd $ load dest@case dword from $ - 4 end virtual store dword dest@case at tablejmp + cnt * 4 store dword value at tableval + cnt * 4 cnt = cnt + 1 \} macro break \{ jmp done \} macro finish@switch \{ done: size = cnt \} } macro endswitch { finish@switch purge case,break,finish@switch } Строится список из указанных значений и список адресов, с помощью scasd ищется совпадение (что быстрее, чем цепочка jump'ов), осуществляется переход на соответствующий адрес. Если значение не найдено, осуществляется переход на последний case (надо же куда-то переходить) Использовать примерно так: Код (Text): switch [value] case 10h ... break case 202h ... break case 0 ... endswitch