как мне вызывать sprintf из crtdll.dll или msvcrt.dll (я так понимаю они ведь аналогичные) для преобразований плавающих точек . Вот пнимаеш целые числа в стек заношу как параметры - работает а плав.точки ни адрес ни переменная целиком (что 32 что 64 что 80 битные для всех вариантов - нихРЕНА!!!) как будет выглядеть скажем такой вызов : char a; sprintf(&a,"%f",12.56); на асме (чё мне в стек пихать ???)
что нибудь вроде Код (Text): szResult: times 255 db 0 szResultFormat db "Result: %g",0 ... cinvoke sprintf, szResult, szResultFormat,dword [dblRes], dword [dblRes + 4]
human45 А ты в дебуге посмотри, какие параметры кладет в стек компилятор (помимо инструкции push возможны конструкции вроде sub esp, 8 fstp [esp], ... )
господа !! я втыкал таким вот образом sub esp,8 mov eax,dword[value64] mov dword[esp],eax mov eax,dword[value64+4] mov dword[esp+4],eax invoke sprintf,strdest,strsource invoke MessageBox,0,strdest,0,0 ... segment '.data' ....................... strdest rb 200h strsource db '%f',0 value64 dq 25.25 однако вместо вразумительной картинки я видел что-то вроде "00.000000" или ещё хуже : "<3..kdf" короче мозги парит мне этот sprintf кстати он из crt.dll .может не в вызове то дело но тогда я думаю я заметил бы это в других приложениях ??
зачем сие извращение? не проше ли писать как я=)) ну или хотябы Код (Text): push dword [value64] push dword [value64 + 4] да кстати вроде стандартный invoke в фасм не работает с C-процедурами вернее не востанавливает стек как положено...
это чё значит получается что в стеке то образуется по младшему адресу старшее двойное слово а по старшему младшее чтоли ???! может ты перепутал с Код (Text): push dword[value64+4] push dword[value64] так будет тоже что и Код (Text): sub esp,8 movq mm0,qword[value64] movq qword[esp],mm0
Может лучше вызвать wsprintf() из USER32? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/wsprintf.asp