Базонезависимый invoke и прототипы.

Тема в разделе "WASM.ASSEMBLER", создана пользователем asd, 8 фев 2007.

  1. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Написал аналог invoke, для работы с базонезависимым кодом:
    Код (Text):
    1. vxpush      macro   arg1
    2.     fSym    SUBSTR <arg1>,1,1
    3.     ifidn fSym,<&>
    4.         var1 SUBSTR <arg1>,2
    5.         lea eax,var1
    6.         push eax
    7.     else
    8.         push arg1
    9.     endif
    10. endm
    11.  
    12. vxinvoke    MACRO   fName,arglist:VARARG
    13.     local count,index
    14.     count = 0
    15.     FOR arg, <arglist>
    16.         count = count +1
    17.     ENDM
    18.     while count
    19.         index = 0
    20.         FOR arg, <arglist>
    21.             index = index + 1
    22.             IF count EQ index
    23.                 vxpush <arg>
    24.             ENDIF
    25.         ENDM
    26.         count=count-1
    27.     endm
    28.     call [fName]
    29. endm
    Вызывается так:
    vxinvoke ххх[ebx],var1[ebx],1,&var1[ebx],17
    где ххх - переменная содержащая адрес вызываемой функции
    [ebx] - дельта(или любой другой, или вообще без регистра)
    var1[ebx] - В качестве параметра передаётся значение переменной var1
    &var1[ebx] - В качестве параметра передаётся адрес переменной var1

    Хочу ещё сделать чтобы макрос проверял количество переданных аргументов. К примеру
    ххх PROTO :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD
    как это сделать? Что-то ничего на ум не приходит, да и макросами я особо не увлекался.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    мне тоже нужен такой макрос, а писать было лень
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    небольшое обновление
    Теперрь можно делать так:
    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
    и следовательно не портят еах