Масм32:макросы, перевернуть VARARG

Тема в разделе "WASM.ASSEMBLER", создана пользователем rain, 5 июн 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Вопрос в следующем:
    В макрос передаётся переменная типа VARARG, и теперь нужно по ним пробежаться с конца а не с начала. Нимогу чё-то ничего токового придумать :dntknw: Искал по форуму, статье Эдмонда, макробиблиотеках, ничего не нашёл. Может это вообще невозможно ?
    Зачем это нужно? хочу сделать что-то вроде аналога для директивы invoke (макрос fn из Хатчевского macros.asm не предлагать так как там не совсем то что нужно)
    Всем заранее сенк
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    тьфу сорри нашёл в статье эдмонда на самом видном месте удалите топ плиз
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Всегда юзаю вариации на тему @ArgRev из Хатчевского MASM reference и доволен :)
    Вот пример моего инвока для СОМов
    Код (Text):
    1. ;-----------------------------------------------------------------------------
    2. ;   Описание COM функции с указанием количества параметров
    3. ;     используется внутри STRUCT, например: STDMETHOD Имя_Функции, p1
    4. STDMETHOD MACRO name, argl
    5.    name&_&argl  dd ?
    6. ENDM
    7. ;-----------------------------------------------------------------------------
    8. ;   Вызов COM функции с проверкой количества параметров
    9. ;     При неверном количестве параметров сообщение в виде:
    10. ;   ": error A2006: undefined symbol : Имя_Функции_p1"
    11. COM_invoke MACRO vtabl, func, this, parmlist:VARARG
    12. LOCAL revlist, arg, SubS4, count
    13.     revlist TEXTEQU < >
    14.     count = 1
    15. %   FOR arg, <parmlist>
    16.       revlist CATSTR <arg>, <!,>, revlist
    17.       count = count + 1
    18.     ENDM
    19.     revlist SUBSTR  revlist, 1, @SizeStr( %revlist ) - 1 ; убрать запятую
    20. %   FOR arg, <revlist>
    21.       SubS4 TEXTEQU @SubStr2(arg, 1, 4)
    22.       IFIDNI SubS4, <addr>
    23.         push @ADDR(@SubStr(arg,5))
    24.       ELSE
    25.         push arg
    26.       ENDIF
    27.     ENDM
    28.     mov eax, this
    29.     push eax
    30.     mov eax, [eax]
    31.     call dword ptr [vtabl. @CatStr(func, <_p>, %count)][eax]
    32. ENDM
    может пригодится :)
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Y_Mur :) сенк
    Ок не прибивайте топ, может кому-то тоже это понадобится и будет искать по форуму, то вот готовый код:
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    хотя не всё так идеально этот макрос не хавает addr, т.е. не переваривает:
    немного офтопа куда делся чувак с ником Edmond? - классные у него статьи
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    потихоньку разбираюсь с макросами, немного усовершенствованный вариант (переваривает addr):
    Код (Text):
    1. xcall MACRO FuncName, args:VARARG
    2.     count = 0
    3.     FOR param, <args>
    4.         count = count + 1    
    5.         @CatStr(var,%count) TEXTEQU <param>
    6.     ENDM
    7.     REPT    count
    8.         new TEXTEQU @CatStr(var,%count)
    9.         IF @InStr(1, %new, addr)
    10.             lea eax, @SubStr(%new,6)
    11.             push eax
    12.         ELSE
    13.             push @CatStr(var,%count)
    14.         ENDIF
    15.         count = count - 1
    16.     ENDM
    17.     call FuncName
    18. ENDM
    макро действительно рулит )
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rain
    Ещё можно автоматически определять нужно lea или хватит offset
    Код (Text):
    1. ;-----------------------------------------------------------------------------
    2. @ADDR MACRO arg
    3.   IF 62h eq opattr(arg) ; не менять порядок сравнения :)
    4.       lea eax, arg
    5.       EXITM <eax>
    6.   ELSE
    7.      EXITM <offset arg>
    8.   ENDIF
    9. ENDM
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    rain
    http://www.wasm.ru/forum/viewtopic.php?id=18840
    Может пригодится
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    asd,Y_Mur
    пасиб
    дык офсет мона и напрямую передавать
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    rain
    Можно, но не всегда удобно ;)
    Например, написал большой блок кода в основной программе, а затем решил перенести его в процедуру и начинаешь долго разбираться где менять offset на addr, а где оставить :)