Как работать с безразмерной функцией

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 7 окт 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Понадобилось как то создать функцию с переменным числом параметров
    то есть функцию которая имеет соглашение о вызовах - C (_cdecl)
    соответственно встал вопрос а как обрабатывать параметры в функции
    если изначально не известно сколько будет параметров
    в пакете платформы - masm32 есть файл справки - masm32.chm
    там в разделе - Full Listing есть страница - VARARG (Proc)
    в ней приводится вроде бы как бы пример

    Код (ASM):
    1.  
    2. addup PROTO NEAR C, parmcount:WORD, parmvalues:VARARG
    3.  
    4. invoke addup, 3, 5, 2, 4
    5.  
    6. addup PROC NEAR C, parmcount:WORD, parmvalues:VARARG
    7. xor ax, ax
    8. xor bx, bx
    9. mov cx, parmcount
    10.  
    11. .REPEAT
    12.    add ax, parmvalues[bx]
    13.    inc bx
    14.    inc bx
    15. .UNTILCXZ
    16.  
    17. ret
    18. addup ENDP
    19.  
    если вместо двух-байтовых параметров сделать четырёх-байтовые
    то я думаю это должно выглядеть так (если я правда не ошибаюсь)

    Код (ASM):
    1.  
    2. addup PROTO NEAR C, parmcount:DWORD, parmvalues:VARARG
    3.  
    4. invoke addup, 3, 5, 2, 4
    5.  
    6. addup PROC NEAR C, parmcount:DWORD, parmvalues:VARARG
    7. xor eax, eax
    8. xor ebx, ebx
    9. mov ecx, parmcount
    10.  
    11. .REPEAT
    12.    add eax, parmvalues[ebx]
    13.    inc ebx
    14.    inc ebx
    15.    inc ebx
    16.    inc ebx
    17. .UNTILCXZ
    18.  
    19. ret
    20. addup ENDP
    21.  
    на первый взгляд вроде как цикл - .REPEAT
    должен отработать столько раз сколько параметров прописано
    в безразмерном - parmvalues:VARARG
    то есть в данном примере четыре раза

    но ничего подобного не происходит
    может быть я где то допустил ошибку
    или этот пример не для этих целей
    тогда возникает вопрос а для чего в справке показан этот пример

    Кто в теме подскажите пожалуйста
     
  2. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Может быть я вас не совсем понял, но вы можете первым параметром передавать некую маску, почти как в printf, и по ней делить стек
     
  3. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    А вообще, строка .UNTILCXZ как бы намекает, что количество параметров в данном примере находится в регистре cx. Туда попадает строкой mov ecx, paramcount. paramcount - первый аргумент функции, после него необходимо передавать остальные
     
    Последнее редактирование: 7 окт 2017
  4. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Да, скорее всего вы правы.

    Я то думал что это какой то способ определения количества параметров
    записанных в - parmvalues:VARARG

    а на самом деле, это банальная подсказка прописанная в первом параметре,
    и цикл - .REPEAT
    отработает столько раз сколько банально прописано в первом параметре