Здравствуйте. Что я хочу сделать, как я до этого дошел и можно ли сделать по другому) Нужно создать числовые константы в виде: iestmetka_1 = 0 iestmetka_2 = 0 iestmetka_3 = 0 ... и т д Их количество может быть разным. Создание и нумерация предполагается в макросе, там же и задается значение. Теперь одна из вещей, для чего это мне. Например я хочу модифицировать безымянную метку "@@:" а именно прыжки "@r/@f", чтобы можно было перепрыгивать безымянные метки на следующие (пример: @r,1; @r,2). Но для этого нужно хранить каждый адрес безымянной метки в уникальном имени.(Это на случай если задачу можно решить не так как я хочу) Сам алгоритм я уже составил. Столкнулся лишь только с тем, что не могу задать цифру в конце имени. Код (ASM): mark_num = 0 macro @@ { @@: mark_num = mark_num + 1 iestmetka_#mark_num = $ ; имя задается как "iestmetka_mark_num" } Он берет название констант, объединяет их, все верно и я это знаю. Но в случае локальных имен например аргумента макроса, то он будет брать значение. Код (ASM): macro test arg { iestmetka_#arg = $ } test 5 ; имя задается как "iestmetka_5" Может это уникальность в самих локальных аргументах, либо с очередью выполнения прохода препроцессора. Вот тут я и завис. Есть правильное решение или аналог?
Невозможно. Решай другими способами: вводя имя метки аргументом макроса, либо через директиву restore восстанавливай предыдущее значение метки. Я бы выбрал первый способ и формировал списки из меток, по которым можно будет ходить другими макросами.
С улучшением механизма безымянных меток тоже есть проблема: Код (ASM): format pe console 4.0 include 'win32ax.inc' entry main macro lb{ local .lbl .lbl: match any,lbl_list \{lbl_list equ lbl_list,.lbl\} match ,lbl_list \{lbl_list equ .lbl \} .last_lbl equ .lbl } macro bw a,b{ local num num=-1 macro gen_bw [c]\{ \common d equ 0 \reverse match =0 =c,d .last_lbl \\{ d equ 1 num=0 \\} match =1,d \\{ if num=b j#a c end if num=num+1 \\} \} match lbl_list,lbl_list \{ gen_bw lbl_list \} } macro fw a,b{ local num num=-1 macro gen_fw [c]\{ \common d equ 0 \forward match =0 =c,d .last_lbl \\{ d equ 1 num=0 \\} match =1,d \\{ if num=b j#a c end if num=num+1 \\} \} match lbl_list,lbl_list \{ gen_fw lbl_list \} } proc main call proc1 call proc2 ret endp proc proc1 lbl_list equ lb nop lb nop lb nop lb nop lb nop bw a,0 lb nop bw b,1 lb nop bw z,3 lb nop lb nop lb nop ret endp proc proc2 lbl_list equ lb nop lb nop lb nop lb nop lb nop fw c,1 lb nop fw b,2 lb nop fw z,3 lb nop lb nop lb nop ret endp Скорей всего в фасм г можно это все сделать, но я им уже пользоваться разучился.
Ссылки вверх идут хорошо, а вот вниз не сделать, так как он, о них, еще не знает. Можно попытаться похимичить директивой store, но чет такое... (Буду пробовать)
NANO_VIRUS, Пойми что это всё дикие извраты, компилер не способен даже данные от кода отличить. Не используй это примитивное говно если не нравится. Выше вот пример таких извратов: Код (Text): 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 Никакой разумный человек такую дич написать и использовать не может.
В фасме г есть директива для пост-обработки, но там проблема будет с длиной (short/near) перехода, что-то закомпилить вместо перехода будет нужно, но оценить короткий будет переход или длинный на этом этапе вряд ли возможно. Как-то это непропорционально заморочно в сравнении с расстановкой обычных меток. Если таки надо произвольное количество меток генерировать макросом - двумя постами выше писал как. Ну и в принципе если ты заранее заполнишь список меток показанным выше способом (даже не устанавливая их, просто заранее зная сколько их будет), то все получится. --- Сообщение объединено, 3 дек 2019 --- То, что ты ни бита не понял, не значит что это дичь. Иди в масм-ветку.
Вроде получилось, правда с ограничением. Не могу никак заставить использовать ссылки в параметрах Прим.. "invoke", но да и шут с ним (Может будет время помучаюсь) Самое полезное что извлек, это то, что макросы более лучше стал понимать. Составить список и понимать очередь обработки. Вообщем большое спасибо Вот если кому нужен вдруг макрос. Не исключаю, что могут появится какие-то несовместимости (Совсем чуток изменил твой пример f13nd ) Спойлер: Код Код (ASM): include 'win32ax.inc' format pe console 4.0 entry main address_list equ mark_list equ macro @@ [arg] { common @@: macro get_f [mark, num] \{ \local a, b match a b, mark \\{ match =:,a \\\{ if (num>0) num=num-1 else if (num=0) b = $ num=num-1 end if \\\} \\} \} match mark_list,mark_list \{ get_f mark_list \} local a a=$ match any,address_list \{address_list equ address_list,a\} match ,address_list \{address_list equ a\} last_address equ a local args args equ forward match any,args\{args equ args,arg\} match ,args\{args equ arg\} common local b, c match b c, args \{ if (b eqtype :) c else args end if \} } struc @r a { match any, a \{ \local num num=-1 macro get_r [c] \\{ \\common \\local d d equ 0 \\reverse match =0 =c,d last_address \\\{ d equ 1 num=0 \\\} match =1,d \\\{ if num=a . c end if num=num+1 \\\} \\} match address_list,address_list \\{ get_r address_list \\} \} match ,a \{ . @r \} } struc @f arg { match a, arg \{ \local mark, num num = a . mark match any,mark_list\\{mark_list equ mark_list,:mark,num\\} match ,mark_list\\{mark_list equ :mark,num\\} \} match , arg \{ . @f \} } proc main call proc1 call proc2 ret endp proc proc1 @@: nop @@: @@:nop nop @@: nop @@: nop ja @r 0 @@: nop jb @r 1 @@: nop jz @r 3 @@: nop @@: nop @@: nop ret endp proc proc2 @@: nop @@: nop @@: nop @@: nop @@: nop jc @f 1 @@: nop jb @f 2 @@: nop jz @f 3 @@: nop @@: nop @@: @@:nop ret endp