Вопрос в следующем: В макрос передаётся переменная типа VARARG, и теперь нужно по ним пробежаться с конца а не с начала. Нимогу чё-то ничего токового придумать Искал по форуму, статье Эдмонда, макробиблиотеках, ничего не нашёл. Может это вообще невозможно ? Зачем это нужно? хочу сделать что-то вроде аналога для директивы invoke (макрос fn из Хатчевского macros.asm не предлагать так как там не совсем то что нужно) Всем заранее сенк
Всегда юзаю вариации на тему @ArgRev из Хатчевского MASM reference и доволен Вот пример моего инвока для СОМов Код (Text): ;----------------------------------------------------------------------------- ; Описание COM функции с указанием количества параметров ; используется внутри STRUCT, например: STDMETHOD Имя_Функции, p1 STDMETHOD MACRO name, argl name&_&argl dd ? ENDM ;----------------------------------------------------------------------------- ; Вызов COM функции с проверкой количества параметров ; При неверном количестве параметров сообщение в виде: ; ": error A2006: undefined symbol : Имя_Функции_p1" COM_invoke MACRO vtabl, func, this, parmlist:VARARG LOCAL revlist, arg, SubS4, count revlist TEXTEQU < > count = 1 % FOR arg, <parmlist> revlist CATSTR <arg>, <!,>, revlist count = count + 1 ENDM revlist SUBSTR revlist, 1, @SizeStr( %revlist ) - 1 ; убрать запятую % FOR arg, <revlist> SubS4 TEXTEQU @SubStr2(arg, 1, 4) IFIDNI SubS4, <addr> push @ADDR(@SubStr(arg,5)) ELSE push arg ENDIF ENDM mov eax, this push eax mov eax, [eax] call dword ptr [vtabl. @CatStr(func, <_p>, %count)][eax] ENDM может пригодится
Y_Mur сенк Ок не прибивайте топ, может кому-то тоже это понадобится и будет искать по форуму, то вот готовый код:
хотя не всё так идеально этот макрос не хавает addr, т.е. не переваривает: немного офтопа куда делся чувак с ником Edmond? - классные у него статьи
потихоньку разбираюсь с макросами, немного усовершенствованный вариант (переваривает addr): Код (Text): xcall MACRO FuncName, args:VARARG count = 0 FOR param, <args> count = count + 1 @CatStr(var,%count) TEXTEQU <param> ENDM REPT count new TEXTEQU @CatStr(var,%count) IF @InStr(1, %new, addr) lea eax, @SubStr(%new,6) push eax ELSE push @CatStr(var,%count) ENDIF count = count - 1 ENDM call FuncName ENDM макро действительно рулит )
rain Ещё можно автоматически определять нужно lea или хватит offset Код (Text): ;----------------------------------------------------------------------------- @ADDR MACRO arg IF 62h eq opattr(arg) ; не менять порядок сравнения :) lea eax, arg EXITM <eax> ELSE EXITM <offset arg> ENDIF ENDM
rain Можно, но не всегда удобно Например, написал большой блок кода в основной программе, а затем решил перенести его в процедуру и начинаешь долго разбираться где менять offset на addr, а где оставить