sprintf

Тема в разделе "WASM.BEGINNERS", создана пользователем human45, 30 окт 2006.

  1. human45

    human45 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    18
    как мне вызывать sprintf из crtdll.dll или msvcrt.dll (я так понимаю они ведь аналогичные) для преобразований плавающих точек . Вот пнимаеш целые числа в стек заношу как параметры - работает а плав.точки ни адрес ни переменная целиком (что 32 что 64 что 80 битные для всех вариантов - нихРЕНА!!!)
    как будет выглядеть скажем такой вызов :
    char a;
    sprintf(&a,"%f",12.56);

    на асме (чё мне в стек пихать ???)
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    что нибудь вроде
    Код (Text):
    1. szResult:    times 255 db 0
    2. szResultFormat  db "Result: %g",0
    3. ...
    4. cinvoke sprintf, szResult, szResultFormat,dword [dblRes], dword [dblRes + 4]
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    human45
    А ты в дебуге посмотри, какие параметры кладет в стек компилятор (помимо инструкции push возможны конструкции вроде
    sub esp, 8
    fstp [esp], ...
    )
     
  4. human45

    human45 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    18
    господа !! я втыкал таким вот образом
    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 .может не в вызове то дело но тогда я думаю я заметил бы это в других приложениях ??
     
  5. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    зачем сие извращение?
    не проше ли писать как я=)) ну или хотябы
    Код (Text):
    1. push dword [value64]
    2. push dword [value64 + 4]
    да кстати вроде стандартный invoke в фасм не работает с C-процедурами вернее не востанавливает стек как положено...
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Работает, только после вызова нужно добавить add esp, 4 * pcount.
     
  7. human45

    human45 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    18
    это чё значит получается что в стеке то образуется по младшему адресу старшее двойное слово а по старшему младшее чтоли ???! может ты перепутал с

    Код (Text):
    1. push dword[value64+4]
    2. push dword[value64]
    так будет тоже что и

    Код (Text):
    1. sub esp,8
    2. movq mm0,qword[value64]
    3. movq qword[esp],mm0
     
  8. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    да попутал я... =))
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    для этого есть cinvoke
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Может лучше вызвать wsprintf() из USER32?

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/wsprintf.asp
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    AsmGuru62
    wsprintf более ограничен, AFAIK.
     
  12. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    У меня этот пример работает (см. аттач)