fasm анонимные метки

Тема в разделе "WASM.BEGINNERS", создана пользователем common_up, 19 май 2011.

  1. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    Иногда бывает нужно в цепочных операциях иметь две и более анонимные метки.
    к примеру:
    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
     
  2. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    Но зачем? Это же адовая путаница будет.
     
  3. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    Не будет путаницы
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    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, но в макросах фасма я не силён.
     
  5. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    common_up
    Где здесь цепочные операции?
    Перепиши парсер фасма в части анонимных меток и перекомпилируй его. Суперского в этом ни чего не вижу!
     
  6. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    Сначала пересоберем парсер, потом пересоберем то и это, потом пропатчим что-то и получим в итоге кучу гемора потом. Надо сделать так, чтобы не пересобирая добиться желаемого результата
     
  7. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Я где-то видел было сделано нечно подобное исключительно с помощью макросов, без правки кода самого ассемблера. Только там были метки @1f, @2f, @3f, @1b, @2b и т. п. - то есть можно вызвать 3-тью следующую анонимную метку например (предел таких меток был 10 в любую сторону, что вполне достаточно). Можно попробовать поиска на форуме fasm'а...
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    С последними исправлениями (версия 1.69.33) появилась возможность реализовать таким образом:
    Файл @@.inc
    Код (Text):
    1. macro def@@ ..@F
    2. {
    3.     macro @@ [args]
    4.     \{
    5.         \common \local ..@BB, ..@FF, matched, remainder
    6.        
    7.         define matched -
    8.         match : rem, args
    9.         \\{
    10.             restore matched
    11.             define matched +
    12.         \\}
    13.         match :, args
    14.         \\{
    15.             restore matched
    16.             define matched +
    17.         \\}
    18.         match +, matched
    19.         \\{
    20.             restore @BB
    21.             @BB equ ..@BB
    22.  
    23.             if defined @B
    24.                 label ..@BB at @B
    25.             end if
    26.            
    27.             purge @@
    28.             @@:
    29.            
    30.             restore @FF
    31.             @FF equ ..@FF
    32.             def@@ ..@FF
    33.                
    34.             if defined @F
    35.                 label ..@F at @F
    36.             end if
    37.  
    38.             match : rem, args \\\{ remainder equ rem \\\}
    39.             match :, args \\\{ remainder equ \\\}
    40.             remainder
    41.             restore remainder
    42.         \\}
    43.         restore matched
    44.     \}
    45. }
    46. match any,any
    47. {
    48.     local ..@FF
    49.     restore @FF
    50.     @FF equ ..@FF
    51.     def@@ ..@FF
    52. }
    Пример использования:
    Код (Text):
    1. use32
    2.  
    3. include '@@.inc'
    4.  
    5. @@: jmp @FF
    6. @@: jmp @B
    7. @@: jmp @BB
    8. jmp @BB
    9. jmp @B
    На более старых версиях компилироваться не будет.

    P.S. Исправил все одинарные точки на двойные. Иначе могут быть проблемы с локальностью меток.
     
  9. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    l_inc
    Объясните, в чём исправления в фасме.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Z3N
    Можно здесь почитать. Кстати, за одно и благодарности автору, выскажу.
     
  11. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    l_inc
    О, я помню это. Я думал это просто фича фасма, а не ошибка....
    Бился над макросом, потом из-за ошибки фасма посчитал, что его сделать невозможно и забил....
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Z3N
    Я тоже так посчитал. Так ждал, пока исправят, а оно, похоже, и на 1.69.32 без проблем компилируется.