Иногда бывает нужно в цепочных операциях иметь две и более анонимные метки. к примеру: cmp eax,1 jnz @F jmp @FF @@: xor eax,eax jmp @FF @@: xor ebx,ebx @@: xor ecx,ecx Было бы вообще супер. Кто-то делал такое или вообще как бы такое замутить ? А то приходится выдумывать метки типа: cmp eax,1 jnz @F jmp .done @@: xor eax,eax jmp done_ok .done xor ebx,ebx .done_ok: xor ecx,ecx
common_up Основная идея это подменить @@ макросом, чтобы в нём определялась метка вида L_{X}:, также переопределялись @B как L_{X}, @F как L_{X+1}, @BB как L_{X-1}, @FF как L_{X+2}, @BBB как L_{X-2} и так далее, а X увеличивался на 1, но в макросах фасма я не силён.
common_up Где здесь цепочные операции? Перепиши парсер фасма в части анонимных меток и перекомпилируй его. Суперского в этом ни чего не вижу!
Сначала пересоберем парсер, потом пересоберем то и это, потом пропатчим что-то и получим в итоге кучу гемора потом. Надо сделать так, чтобы не пересобирая добиться желаемого результата
Я где-то видел было сделано нечно подобное исключительно с помощью макросов, без правки кода самого ассемблера. Только там были метки @1f, @2f, @3f, @1b, @2b и т. п. - то есть можно вызвать 3-тью следующую анонимную метку например (предел таких меток был 10 в любую сторону, что вполне достаточно). Можно попробовать поиска на форуме fasm'а...
С последними исправлениями (версия 1.69.33) появилась возможность реализовать таким образом: Файл @@.inc Код (Text): macro def@@ ..@F { macro @@ [args] \{ \common \local ..@BB, ..@FF, matched, remainder define matched - match : rem, args \\{ restore matched define matched + \\} match :, args \\{ restore matched define matched + \\} match +, matched \\{ restore @BB @BB equ ..@BB if defined @B label ..@BB at @B end if purge @@ @@: restore @FF @FF equ ..@FF def@@ ..@FF if defined @F label ..@F at @F end if match : rem, args \\\{ remainder equ rem \\\} match :, args \\\{ remainder equ \\\} remainder restore remainder \\} restore matched \} } match any,any { local ..@FF restore @FF @FF equ ..@FF def@@ ..@FF } Пример использования: Код (Text): use32 include '@@.inc' @@: jmp @FF @@: jmp @B @@: jmp @BB jmp @BB jmp @B На более старых версиях компилироваться не будет. P.S. Исправил все одинарные точки на двойные. Иначе могут быть проблемы с локальностью меток.
l_inc О, я помню это. Я думал это просто фича фасма, а не ошибка.... Бился над макросом, потом из-за ошибки фасма посчитал, что его сделать невозможно и забил....
Z3N Я тоже так посчитал. Так ждал, пока исправят, а оно, похоже, и на 1.69.32 без проблем компилируется.