Препроцессор. Нумерация глобальных числовых констант

Тема в разделе "FASM", создана пользователем NANO_VIRUS, 24 ноя 2019.

Метки:
  1. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    15
    Здравствуйте. Что я хочу сделать, как я до этого дошел и можно ли сделать по другому)

    Нужно создать числовые константы в виде:
    iestmetka_1 = 0
    iestmetka_2 = 0
    iestmetka_3 = 0
    ...
    и т д

    Их количество может быть разным. Создание и нумерация предполагается в макросе, там же и задается значение.

    Теперь одна из вещей, для чего это мне.
    Например я хочу модифицировать безымянную метку "@@:"
    а именно прыжки "@r/@f", чтобы можно было перепрыгивать безымянные метки на следующие (пример: @r,1; @r,2). Но для этого нужно хранить каждый адрес безымянной метки в уникальном имени.(Это на случай если задачу можно решить не так как я хочу)

    Сам алгоритм я уже составил. Столкнулся лишь только с тем, что не могу задать цифру в конце имени.

    Код (ASM):
    1. mark_num = 0
    2. macro @@
    3. {
    4.  @@:
    5.  mark_num = mark_num  + 1
    6.  iestmetka_#mark_num = $ ; имя задается как "iestmetka_mark_num"
    7. }
    Он берет название констант, объединяет их, все верно и я это знаю. Но в случае локальных имен например аргумента макроса, то он будет брать значение.

    Код (ASM):
    1. macro test arg
    2. {
    3.  iestmetka_#arg = $
    4. }
    5.  
    6. test 5 ; имя задается как "iestmetka_5"
    Может это уникальность в самих локальных аргументах, либо с очередью выполнения прохода препроцессора.
    Вот тут я и завис. Есть правильное решение или аналог?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Невозможно. Решай другими способами: вводя имя метки аргументом макроса, либо через директиву restore восстанавливай предыдущее значение метки. Я бы выбрал первый способ и формировал списки из меток, по которым можно будет ходить другими макросами.
     
    NANO_VIRUS нравится это.
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    С улучшением механизма безымянных меток тоже есть проблема:
    Код (ASM):
    1.  
    2. format pe console 4.0
    3. include 'win32ax.inc'
    4. entry main
    5. macro lb{
    6.       local .lbl
    7.       .lbl:
    8.       match any,lbl_list \{lbl_list equ lbl_list,.lbl\}
    9.       match ,lbl_list \{lbl_list equ .lbl \}
    10.       .last_lbl equ .lbl
    11. }
    12. macro bw a,b{
    13.       local num
    14.       num=-1
    15.       macro gen_bw [c]\{
    16.             \common
    17.                 d equ 0
    18.             \reverse
    19.                 match =0 =c,d .last_lbl \\{
    20.                       d equ 1
    21.                       num=0
    22.                 \\}
    23.                 match =1,d \\{
    24.                       if num=b
    25.                          j#a c
    26.                       end if
    27.                       num=num+1
    28.                 \\}
    29.         \}
    30.         match lbl_list,lbl_list \{ gen_bw lbl_list \}
    31. }
    32. macro fw a,b{
    33.       local num
    34.       num=-1
    35.       macro gen_fw [c]\{
    36.             \common
    37.                 d equ 0
    38.             \forward
    39.                 match =0 =c,d .last_lbl \\{
    40.                       d equ 1
    41.                       num=0
    42.                 \\}
    43.                 match =1,d \\{
    44.                       if num=b
    45.                          j#a c
    46.                       end if
    47.                       num=num+1
    48.                 \\}
    49.       \}
    50.       match lbl_list,lbl_list \{ gen_fw lbl_list \}
    51. }
    52. proc main
    53.      call proc1
    54.      call proc2
    55.      ret
    56. endp
    57. proc proc1
    58.      lbl_list equ
    59.      lb
    60.      nop
    61.      lb
    62.      nop
    63.      lb
    64.      nop
    65.      lb
    66.      nop
    67.      lb
    68.      nop
    69.      bw a,0
    70.      lb
    71.      nop
    72.      bw b,1
    73.      lb
    74.      nop
    75.      bw z,3
    76.      lb
    77.      nop
    78.      lb
    79.      nop
    80.      lb
    81.      nop
    82.      ret
    83. endp
    84. proc proc2
    85.      lbl_list equ
    86.      lb
    87.      nop
    88.      lb
    89.      nop
    90.      lb
    91.      nop
    92.      lb
    93.      nop
    94.      lb
    95.      nop
    96.      fw c,1
    97.      lb
    98.      nop
    99.      fw b,2
    100.      lb
    101.      nop
    102.      fw z,3
    103.      lb
    104.      nop
    105.      lb
    106.      nop
    107.      lb
    108.      nop
    109.      ret
    110. endp
    111.  
    Скорей всего в фасм г можно это все сделать, но я им уже пользоваться разучился.
     
    NANO_VIRUS нравится это.
  4. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    15
    Ссылки вверх идут хорошо, а вот вниз не сделать, так как он, о них, еще не знает. Можно попытаться похимичить директивой store, но чет такое... (Буду пробовать)
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    NANO_VIRUS,

    Пойми что это всё дикие извраты, компилер не способен даже данные от кода отличить. Не используй это примитивное говно если не нравится. Выше вот пример таких извратов:

    Код (Text):
    1.  
    2. 32.macro fw a,b{
    3. 33.      local num
    4. 34.      num=-1
    5. 35.      macro gen_fw [c]\{
    6. 36.            \common
    7. 37.                d equ 0
    8. 38.            \forward
    9. 39.                match =0 =c,d .last_lbl \\{
    10. 40.                      d equ 1
    11. 41.                      num=0
    12.  
    Никакой разумный человек такую дич написать и использовать не может.
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    В фасме г есть директива для пост-обработки, но там проблема будет с длиной (short/near) перехода, что-то закомпилить вместо перехода будет нужно, но оценить короткий будет переход или длинный на этом этапе вряд ли возможно. Как-то это непропорционально заморочно в сравнении с расстановкой обычных меток. Если таки надо произвольное количество меток генерировать макросом - двумя постами выше писал как. Ну и в принципе если ты заранее заполнишь список меток показанным выше способом (даже не устанавливая их, просто заранее зная сколько их будет), то все получится.
    --- Сообщение объединено, 3 дек 2019 ---
    То, что ты ни бита не понял, не значит что это дичь. Иди в масм-ветку.
     
    NANO_VIRUS нравится это.
  7. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    15
    Вроде получилось, правда с ограничением. Не могу никак заставить использовать ссылки в параметрах Прим.. "invoke", но да и шут с ним (Может будет время помучаюсь)

    Самое полезное что извлек, это то, что макросы более лучше стал понимать. Составить список и понимать очередь обработки. Вообщем большое спасибо

    Вот если кому нужен вдруг макрос. Не исключаю, что могут появится какие-то несовместимости (Совсем чуток изменил твой пример f13nd :popcorm2:)
    Код (ASM):
    1. include 'win32ax.inc'
    2.  
    3. format pe console 4.0
    4.  
    5. entry main
    6.  
    7. address_list equ
    8. mark_list equ
    9.  
    10. macro @@ [arg]
    11. {
    12.     common
    13.         @@:
    14.      
    15.         macro get_f [mark, num] \{
    16.      
    17.             \local a, b
    18.             match a b, mark \\{
    19.          
    20.                 match =:,a \\\{
    21.              
    22.                     if (num>0)
    23.                         num=num-1
    24.                     else if (num=0)
    25.                         b = $
    26.                         num=num-1
    27.                     end if
    28.                 \\\}
    29.             \\}
    30.         \}
    31.      
    32.         match mark_list,mark_list \{ get_f mark_list \}
    33.      
    34.         local a
    35.         a=$
    36.      
    37.         match any,address_list \{address_list equ address_list,a\}
    38.         match ,address_list \{address_list equ a\}
    39.         last_address equ a
    40.      
    41.         local args
    42.         args equ
    43.     forward
    44.         match any,args\{args equ args,arg\}
    45.         match ,args\{args equ arg\}
    46.      
    47.     common
    48.         local b, c
    49.         match b c, args \{
    50.      
    51.             if (b eqtype :)
    52.                 c
    53.             else
    54.                 args
    55.             end if
    56.         \}
    57. }
    58.  
    59.  
    60. struc @r a
    61. {
    62.     match any, a \{
    63.         \local num
    64.         num=-1
    65.         macro get_r [c] \\{
    66.      
    67.             \\common
    68.                 \\local d
    69.                 d equ 0
    70.              
    71.             \\reverse
    72.                 match =0 =c,d last_address \\\{
    73.      
    74.                     d equ 1
    75.                     num=0
    76.                 \\\}
    77.              
    78.                 match =1,d \\\{
    79.              
    80.                     if num=a
    81.                         . c
    82.                     end if
    83.                     num=num+1
    84.                 \\\}
    85.         \\}
    86.         match address_list,address_list \\{ get_r address_list \\}
    87.     \}
    88.  
    89.     match ,a \{
    90.  
    91.         . @r
    92.     \}
    93. }
    94.  
    95. struc @f arg
    96. {
    97.     match a, arg \{
    98.      
    99.         \local mark, num
    100.      
    101.         num = a
    102.         . mark
    103.      
    104.         match any,mark_list\\{mark_list equ mark_list,:mark,num\\}
    105.         match ,mark_list\\{mark_list equ :mark,num\\}
    106.     \}
    107.  
    108.     match , arg \{
    109.  
    110.         . @f
    111.     \}
    112. }
    113.  
    114. proc main
    115.      call proc1
    116.      call proc2
    117.      ret
    118. endp
    119. proc proc1
    120.      @@:
    121.      nop
    122.      @@:
    123.      @@:nop
    124.      nop
    125.      @@:
    126.      nop
    127.      @@:
    128.      nop
    129.      ja @r 0
    130.      @@:
    131.      nop
    132.      jb @r 1
    133.      @@:
    134.      nop
    135.      jz @r 3
    136.      @@:
    137.      nop
    138.      @@:
    139.      nop
    140.      @@:
    141.      nop
    142.      ret
    143. endp
    144. proc proc2
    145.      @@:
    146.      nop
    147.      @@:
    148.      nop
    149.      @@:
    150.      nop
    151.      @@:
    152.      nop
    153.      @@:
    154.      nop
    155.      jc @f 1
    156.      @@:
    157.      nop
    158.      jb @f 2
    159.      @@:
    160.      nop
    161.      jz @f 3
    162.      @@:
    163.      nop
    164.      @@:
    165.      nop
    166.      @@:
    167.      @@:nop
    168.      ret
    169. endp