wsprintf

Тема в разделе "WASM.WIN32", создана пользователем mix_mix, 28 мар 2006.

  1. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Блин, у меня аж волосы дыбом встали! Оказывается при использовании функции wsprintf, masm сам добавляет add esp, n. А я то думал почему у меня ничего не работает, когда я тоже числил стек. Охренеть можно.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    только при использовании invoke
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Тоже сталкивался может месяца 3 назад с этой проблемой когда писал один код, тоже для меня неожиданностью это было...
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Смотрите прототипы - не будет неожиданностей



    PROTO C
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    cresta

    Весь АПИ конечно не запомнишь, потому приходится учится на ошибках
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Corleone

    Для этого и придумали proto & invoke, чтобы не запоминать, сколько параметров и какая форма вызова у каждой функции. Один раз определил и забыл.
     
  7. Guest

    Guest Guest

    Публикаций:
    0
    IceStudent

    Там где я вызывал wsprintf, нужно было использовать только call, потому и напоролся. А вообще напишу свою, чтобы работала без ограничения по размеру, т.к. wsprintf работает только с буффером 1024 байт максимум.
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    но зачем? invoke сама добавит коррекцию стека для cdecl

    функции wsprintf, иначе нужно самому добавлять add esp, ..
    Код (Text):
    1. push eax
    2. push OFFSET format
    3. push OFFSET szBuff
    4. call wsprintf
    5. add esp, 00Ch  ; количество push * sizeof DWORD
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Так его и использовал бы. Не было бы автоматической коррекции стека, которая вас так смущает.
     
  10. Guest

    Guest Guest

    Публикаций:
    0
    IceStudent

    Если быть максимально точным - то юзал макрос scall, в котором уже и вызывается call. и ес-но ф-и вызывал как и инвок.
     
  11. ISM

    ISM Серега

    Публикаций:
    0
    Регистрация:
    20 мар 2006
    Сообщения:
    23
    Адрес:
    Transnistria
    Hi people! Ребята, я воще не догоняю откуда такая проблема. Писать под винду я начал после прочтения книги Ю.Магды "Ассемблер для Windows" в которой впервые и встретил описание wsprintf. Крига содержит исходники под MASM и там после invoke wsprintf, ... всегда используется add esp,n*4 . Я использую wsprintf по той же технологии почти every day и никаких проблем. Чё у вас за masm такой?
     
  12. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    Неправильный у нас масм, после invoke wsprintf никогда стек не равнял... И вообще - real men code in binary.
     
  13. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    альтернативный макрос:
    Код (Text):
    1. ; ### Call
    2. _call   MACRO procedure, parameters:VARARG
    3.     Local param, reversed
    4.     reversed TEXTEQU <>
    5. %   For param, <parameters>
    6.         reversed CATSTR <param>, <!,>, reversed
    7.     EndM
    8. %   For param, <reversed>
    9.         push    param
    10.     EndM
    11.     call    procedure
    12. ENDM


    можно звать так:

    _call ExitProcess,eax
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    Отсутствие проблем не свидетельствует о правильности кода :)
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Отсутствие проблем не свидетельствует о правильности кода :)



    Точно, типичный пример:

    sprintf("%s%s%s", str1, str2);



    Компилятор молчит, а программер мучается в посиках ошибки. Чаще всего возникает при копировании кода, как впрочем, и остальные 75% ошибок!
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    посиках=поисках - тут уже остальные 25%, связанные с очепатками
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Мужики, бес попутал, вместо sprintf надо понимать sscanf. Это уже ни в какие ворота не лезет! Остальные 0.0001% нао отнести на выпитое пиво!
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Верно. Для решения этой проблемы придумали перегрузку типизированных операторов ввода/вывода << >> в stl и шаблонную перегрузку в boost.
     
  19. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    crypto





    В VS2005 входит компилятор, который иногда ругается на такие вещи. Например для строки кода:

    <font face="fixedsys]sprintf (m_typeName, "%s%d", 1);</font><!--face-->



    Выдается:

    warning C4313: 'sprintf': '%d' in format string conflicts with argument 2 of type 'char *'



    Понять этот воринг правда мне не удалось.
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    alpet



    MSDN: