Блин, у меня аж волосы дыбом встали! Оказывается при использовании функции wsprintf, masm сам добавляет add esp, n. А я то думал почему у меня ничего не работает, когда я тоже числил стек. Охренеть можно.
Тоже сталкивался может месяца 3 назад с этой проблемой когда писал один код, тоже для меня неожиданностью это было...
Corleone Для этого и придумали proto & invoke, чтобы не запоминать, сколько параметров и какая форма вызова у каждой функции. Один раз определил и забыл.
IceStudent Там где я вызывал wsprintf, нужно было использовать только call, потому и напоролся. А вообще напишу свою, чтобы работала без ограничения по размеру, т.к. wsprintf работает только с буффером 1024 байт максимум.
но зачем? invoke сама добавит коррекцию стека для cdecl функции wsprintf, иначе нужно самому добавлять add esp, .. Код (Text): push eax push OFFSET format push OFFSET szBuff call wsprintf add esp, 00Ch ; количество push * sizeof DWORD
IceStudent Если быть максимально точным - то юзал макрос scall, в котором уже и вызывается call. и ес-но ф-и вызывал как и инвок.
Hi people! Ребята, я воще не догоняю откуда такая проблема. Писать под винду я начал после прочтения книги Ю.Магды "Ассемблер для Windows" в которой впервые и встретил описание wsprintf. Крига содержит исходники под MASM и там после invoke wsprintf, ... всегда используется add esp,n*4 . Я использую wsprintf по той же технологии почти every day и никаких проблем. Чё у вас за masm такой?
Неправильный у нас масм, после invoke wsprintf никогда стек не равнял... И вообще - real men code in binary.
альтернативный макрос: Код (Text): ; ### Call _call MACRO procedure, parameters:VARARG Local param, reversed reversed TEXTEQU <> % For param, <parameters> reversed CATSTR <param>, <!,>, reversed EndM % For param, <reversed> push param EndM call procedure ENDM можно звать так: _call ExitProcess,eax
Отсутствие проблем не свидетельствует о правильности кода Точно, типичный пример: sprintf("%s%s%s", str1, str2); Компилятор молчит, а программер мучается в посиках ошибки. Чаще всего возникает при копировании кода, как впрочем, и остальные 75% ошибок!
Мужики, бес попутал, вместо sprintf надо понимать sscanf. Это уже ни в какие ворота не лезет! Остальные 0.0001% нао отнести на выпитое пиво!
Верно. Для решения этой проблемы придумали перегрузку типизированных операторов ввода/вывода << >> в stl и шаблонную перегрузку в boost.
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 *' Понять этот воринг правда мне не удалось.