Написал аналог invoke, для работы с базонезависимым кодом: Код (Text): vxpush macro arg1 fSym SUBSTR <arg1>,1,1 ifidn fSym,<&> var1 SUBSTR <arg1>,2 lea eax,var1 push eax else push arg1 endif endm vxinvoke MACRO fName,arglist:VARARG local count,index count = 0 FOR arg, <arglist> count = count +1 ENDM while count index = 0 FOR arg, <arglist> index = index + 1 IF count EQ index vxpush <arg> ENDIF ENDM count=count-1 endm call [fName] endm Вызывается так: vxinvoke ххх[ebx],var1[ebx],1,&var1[ebx],17 где ххх - переменная содержащая адрес вызываемой функции [ebx] - дельта(или любой другой, или вообще без регистра) var1[ebx] - В качестве параметра передаётся значение переменной var1 &var1[ebx] - В качестве параметра передаётся адрес переменной var1 Хочу ещё сделать чтобы макрос проверял количество переданных аргументов. К примеру ххх PROTO WORD,WORD,WORD,WORD как это сделать? Что-то ничего на ум не приходит, да и макросами я особо не увлекался.
небольшое обновление Теперрь можно делать так: vxinvoke ххх[ebx],'some text',"other text",1,&var1[ebx],17 код сгенерируется такой: call label1 db 'some text' db 0 label1: и теперь можно передавать параметр в еах в любом месте. Кобанды &var1[ebx]генерируют такой код: push eax lea eax,var1[ebx] xchg [esp],eax и следовательно не портят еах