|
|
| Посл.отвђт | Сообщен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 |