· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› add esp,12

Посл.отвђт Сообщенiе


Дата: Дек 26, 2003 12:41:06

Вот сталкнулся в книжке с примером:

push dword ptr p1
push offset lpFmt
push offset charBuf
call wsprintf
add esp,12

Потом автор(Юрий Магда) поясняет:
Ф-ия wsprintf использует соглашение cdecl, а это значит, что очищать стек должна вызывающая процедура, т.е. наша программа. Поэтому и появляется после вызова
add esp,12
Ф-ия wsprintf принимает 3 параметра (это 12 байт)

Вот тут и вопрос 12 байт = 0С в 16-ричной
тогда вместо
add esp,12 -> add esp,0c
или автор что то не досказал 12 -> 18 В шестнатеричной.


Дата: Дек 26, 2003 13:01:57

Все правильно, после функций с переменным числом параметром (типа printf, scanf, etc) стек нужно самому чистить. 3 параметра = 3*4=12 байт, т.ч. все ОК. 12 в десятичной или 0сh в хексе.


Дата: Дек 26, 2003 15:27:06

masquer
Ппонял, спасибо!


Дата: Дек 26, 2003 18:09:27

Интересно что invoke wsprintf,,,
в масм'е генерит как-раз такой код как в сабж'е,
а вот если вызывать через call wsprintf, то никакого add esp,... не будет.


Дата: Дек 26, 2003 19:37:36

Asterix
В M$ masm наврядли ;)
Это в masm32 кто-то добрый написал в windows.inc & user32.inc:
wsprintfA PROTO C :DWORD,:VARARG
wsprintf equ <wsprintfA>
А CALL разве должен что генерить кроме опкода?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045