FASM и генерация меток

Тема в разделе "WASM.ASSEMBLER", создана пользователем xRom2, 26 апр 2011.

  1. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Как в фасме получить метки часть имени которых задается числовой константой? Типа
    a = 1
    @1:

    a = 2
    @2:

    a = 1000
    @1000:
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Постарайтесь отказаться от использования меток.
    Ухудшается читаемость программы.

    Если всё-равно надо, то на масме будет так:
    Код (Text):
    1. delta dd 0
    2. a      dd 1000
    3.  
    4. mov ebp, delta
    5. mov eax, a
    6.  
    7. jmp dword ptr [ebp+eax]
    Или вам паскаль ближе?
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    xRom2
    да вроде-бы никак, вот если есть полноеимя, то:
    Код (Text):
    1. mov eax,qwe
    2. qwe:
    eax - адрес qwe.
     
  4. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    На masm`e легко делается
    Код (Text):
    1. MetkaNum=0
    2. Metka CATSTR <metik_>,@CatStr(%MetkaNum)
    3. MetkaNum=MetkaNum+1
    4. Metka:
    5.      jmp metik_0
     
  5. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Числовой константой (константой времени ассемблирования) — никак. Символической константой (константой времени препроцессорной обработки), содержащей число — легко:
    Код (Text):
    1. ;Allows calculations with preprocessor
    2. ;usage: result equcalc 15/2 mod result
    3. struc equcalc expr
    4. {
    5.     rept 1 res:expr
    6.     \{
    7.         restore .
    8.         . equ res
    9.     \}
    10. }
    11.  
    12.  
    13. ;jump table
    14. jmp label_1
    15. jmp label_2
    16. jmp label_4
    17.  
    18. ;a = 1
    19. a equ 1
    20. ;declare label_1
    21. match a,a { label_#a: }
    22.  
    23. ;a = a + 1
    24. a equcalc a + 1
    25. ;declare label_2
    26. match a,a { label_#a: }
    27.  
    28. ;a = 2*a
    29. a equcalc 2*a
    30. ;declare label_4
    31. match a,a { label_#a: }
    Это будет работать на версиях, начиная с 1.69. На более старых вычисления с символическими константами также возможны, но нужны неслабые извращения.

    P.S. Опоздал на дофига минут... ну да ладно... бесполезным не будет.
     
  7. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Человек - ты гений! Ты единственный кто на просторах рунета и прочего нета подсказал работающий вариант. Спасибо! А можно еще вопрос? Почему в репте ты используешь "\{" а не просто "{"?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Пожалуйста. Но в приведенном коде моих собственных идей не больше нуля. Ну и то, что никто другой не ответил, не означает, что никто другой не мог ответить.
    Для соответствия скобке, закрывающей макроблок rept. Это чисто эстетическая потребность.
    А вот закрывающая скобка обязана быть экранированной слешем. В противном случае она бы трактовалась, как закрытие макроса struc equcalc, а не блока rept. Во время раскрытия каждого макроса fasm убирает один слеш перед каждым символом (имеется в виду symbol, а не character). Поэтому после раскрытия struc equcalc скобки "\{" и "\}" станут скобками "{" и "}". После этого макроблок rept будет раскрыт так, как будто никаких экранирующих слешей перед скобками нету.

    По ссылке, приведенной iZzz32 в шестом посте есть как раз пример "извращений" с вычислениями над символическими константами для версий fasm ранее 1.69. Там довольно активно используются экранирующие слеши, хотя автор и решил не ставить их перед открывающими скобками.

    P.S. Кстати, не обязательно каждый раз явно писать match. Можно и так:
    Код (Text):
    1. macro lbl namestart*, nameend* { match n1 n2, namestart nameend \{ n1\#n2: \} }
    2.  
    3. ;jump table
    4. jmp label_1
    5. jmp label_2
    6. jmp label_4
    7.  
    8. a equcalc 1
    9. lbl label_,a
    10.  
    11. a equcalc 2
    12. lbl label_,a
    13.  
    14. a equcalc 4
    15. lbl label_,a
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.623
    Адрес:
    Russia
    l_inc
    задолбали эти профессионалы фасма ??? :) - никакого житья от них, еще и учить лезут

    мой 16- битный дос вариант на масме

    Код (Text):
    1. ;;======[ MACRO ]=================================
    2. @Call_far\
    3.     MACRO\
    4.         Tag:req,\
    5.         Method_ID:req
    6.     ;;----------------------------------------
    7.     IFNDEF  &Tag&_0
    8. &Tag&_Ordinal\
    9.     =   0
    10.     ELSE
    11. &Tag&_Ordinal\
    12.     =   &Tag&_Ordinal+1
    13.     ENDIF
    14.     ;;----------------------------------------
    15. @_Tag   TEXTEQU\
    16.     @CATSTR (Tag,<_>,%(&Tag&_Ordinal))
    17.     ;;----------------------------------------
    18.     IF  @Watch
    19.     %ECHO   @Module
    20.     %ECHO\
    21.     @CATSTR (Tag,<_>,%(&Tag&_Ordinal))
    22.     ENDIF
    23.     ;;----------------------------------------
    24.     BYTE    9Ah ;; code(call)
    25.     WORD    Method_ID ;; ofs(Method)
    26. @_Tag\
    27.     WORD    ? ;; seg(Method)
    28.     ;;----------------------------------------
    29.     ENDM
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rockphorr
    Ох уж эти новички masm'а. Всё пытаются доказать, что их инструмент лучше. :)