Как в fasm создать имя метки, часть которой - вычисленный номер?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Benjamin, 17 ноя 2009.

  1. Benjamin

    Benjamin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    5
    Это:

    macro lab n {label lab_#n}
    La=1
    Lb equ 2

    lab La
    lab Lb

    создает метки lab_La и lab_Lb,
    а требуется lab_1 и lab_2.

    Прошу подсказать.
     
  2. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Как вариант, La fix 1, Lb fix 2 :derisive:
     
  3. Benjamin

    Benjamin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    5
    Пасибо за ответ, но 1 и 2 (числа вставляемые в имена меток) требуются динамические - т.е. в зависимости он некоторых условий масрос вычисляет число и формирует метку с включением его в имя, а fix - статика.
     
  4. Benjamin

    Benjamin New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    5
    В форуме нашел такой пример:
    http://www.wasm.ru/forum/viewtopic.php?id=33793
    где использовано такое:
    ...
    n=n+1
    ...
    virtual at esp
    .loc#n:
    ...
    Однако под facm 1.68 этот пример не работает.
    Так как же?
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    есть вариант для масма ?? нужен ?? выложу
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Может автор уже забыл про эту ветку, но я всё же напишу, вот макросы, которые позволяют манипулировать с названиями как с числами, только объявлять надо через "=".
    Код (Text):
    1. macro pre_mul result,x,y {
    2.         match xx yy,x y {
    3.                 result equ xx
    4.                 rept xx {
    5.                         match w,result {
    6.                                 rept yy j:w {
    7.                                         result equ j
    8.                                 \\\\}
    9.                         \\\}
    10.                 \\}
    11.         \}
    12. }
    13. macro pre_div result,remainder,x,y {
    14.         match xx yy,x y {
    15.                 remainder equ 0
    16.                 result equ 0
    17.                 rept xx {
    18.                         pre_inc remainder,remainder
    19.                         match t,remainder {
    20.                                 match =t,yy {
    21.                                         pre_inc result,result
    22.                                         remainder equ 0
    23.                                 \\\\}
    24.                         \\\}
    25.                 \\}
    26.         \}
    27. }
    28. macro pre_add result,x,y {
    29.         match xx yy,x y {
    30.                 rept yy j:xx {
    31.                         result equ j
    32.                 \\}
    33.         \}
    34.         pre_inc result,result
    35. }
    36. macro pre_sub result,x,y {
    37.         match xx yy,x y {
    38.                 result equ xx
    39.                 rept yy {
    40.                         pre_dec result,result
    41.                 \\}
    42.         \}
    43. }
    44. macro pre_inc result,x {
    45.         match xx,x {
    46.                 rept 2 j:xx {
    47.                         result equ j
    48.                 \\}
    49.         \}
    50. }
    51. macro pre_dec result,x {
    52.         match xx,x {
    53.                 rept xx j:0 {
    54.                         result equ j
    55.                 \\}
    56.         \}
    57. }
    Думаю, что должно помочь. Где вы думаете я нашёл это??? Правильный ответ - на флатассемблер.нэт. Макросов там ....

    P.S.:
    Макродвижок у фасма конечно не ахти. Я пытался написать макро, который бы объявлял строки, а потом резервировал для них место в нужном месте *(. Да и ещё чтобы находил дубликаты и использовал одну метку на несколько строк.
    До сих пор пишу.... =О
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    любители дос кодинга на масме эту проблему решают так -


    Код (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
    использовать так
    Код (Text):
    1. @Watch=1
    2. @Call_far\
    3.     wrap_bem,@AL_Case_Up_ID
    4. @Call_far\
    5.     wrap_bem,@AL_Case_Up_ID
    где @AL_Case_Up_ID смещение 16 бит процедуры установки верхнего регистра для символа
    в результате будут созданы две метки по адресам которых надо будет записать сегмент процедуры установки верхнего регистра для символа
    имена меток
    wrap_bem_0
    и
    wrap_bem_1
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    для удобства все отображается в выводе ml.exe
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Rockphorr
    Это конечно здорово, но топик про FASM.
     
  10. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Есть прием использования вложенной директивы match, я всегда им пользуюсь.
    Так как параметры макроинструкций не заменяются их значениями, то здесь следует вспомнить директиву match, у которой параметры, если это символьные константы(определенные с помощью equ или define) как раз заменяются, мы ее просто вкладываем в макрос.

    И это после препроцессинга
    Код (Text):
    1. macro lab n
    2. {
    3. match value ,n
    4.   \{
    5.   label lab_\#value
    6.   \}
    7. }
    8.  
    9. La=1
    10. Lb equ 2
    11.  
    12. lab La
    13. lab Lb
    превращается в это
    Код (Text):
    1. ;macro lab n
    2. ;{
    3. ; match value,n
    4. ; \{
    5. ; label lab_ \# value
    6. ; \}
    7. ;}
    8.  
    9. La=1
    10. ;Lb equ 2
    11.  
    12. ;lab La
    13.    
    14.     ;match value,La
    15.     ;{
    16.     ; label lab_#value
    17.     ;}
    18.    
    19.     label lab_La
    20.    
    21.    
    22. ;lab Lb
    23.    
    24.     ;match value,2
    25.     ;{
    26.     ; label lab_#value
    27.     ;}
    28.    
    29.     label lab_2
    Видно, что с "=" это не работает, т.к. "=" обрабатывается на стадии ассемблирования.
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Опять дискриминация со стороны фасм-профессионалов :)))
     
  12. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Asvald
    Z3N
    Простите, действительно, надо объявлять через equ.