Проблемы с wsprintf в FASM'е

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

  1. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    Пытаюсь перейти с масма на фасм но при компиляции фасм ругается на wsprintf. В чем проблема?

     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Добавь её в импорт.
     
  3. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    А с подключением '%FASMINC%\win32ax.inc' это разве еще и вручную надо дописывать? Зачем писать то же 2 раза?
    Как написал второй раз, скомпилилось, но при выполнении дает ошибку.
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    и еще плюс к вышесказанному нужно вызывать как
    call [wsprintf]
    или
    cinvoke wsprintf, ..., ..., ...
     
  5. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    это только wsprintf так надо вызывать?
     
  6. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    Блин, никак понять не могу почему не хочет работать. Вот листинг, кому несложно, гляньте на него, там пара инструкций и куча головной боли :dntknw:

    Код (Text):
    1. format PE GUI 4.0
    2. include '%FASMINC%\win32ax.inc'
    3.  
    4. start:
    5.  
    6. inc [count]
    7. push count
    8. push szformat
    9. push filename
    10. call [wsprintf]
    11. push NULL
    12. push FILE_ATTRIBUTE_NORMAL
    13. push OPEN_ALWAYS
    14. push NULL
    15. push NULL
    16. push GENERIC_WRITE
    17. push filename
    18. call CreateFile
    19. push eax
    20. call CloseHandle
    21.  
    22. jmp start
    23. ; Never exit
    24.  
    25. count       dd 0
    26. filename    rd 15h
    27. szformat    db '%i',0
    28.  
    29. ;data import
    30. ;
    31. ;library kernel32,'KERNEL32.DLL',\
    32. ;       user32,'USER32.DLL'
    33. ;
    34. ;import kernel32,\
    35. ;   CreateFile,'CreateFileA',\
    36. ;   CloseHandle,'CloseHandle'
    37. ;
    38. ;import user32,\
    39. ;   wsprintf,'wsprintfA'
    40. ;
    41. ;end data
    импорт я специально оформил в коменты, так как импорт подключается из win32ax.inc

    И еще, я специально хочу сделать односекционную программу, знаю что в фасме это не проблема.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    SiruS
    смотри примеры в дистрибутиве фасма
    через call импортируемые функции вызываются
    так
    call [имя_функции]

    что касается wsprintf то это впридачу cdecl функция, поэтому если ты ее вызываешь не через
    cinvoke то необходима коррекция стека, например
    Код (Text):
    1. invoke GetLocalTime, ebx
    2.   virtual at ebx
    3.              systime  SYSTEMTIME
    4.   end virtual
    5.   xor eax, eax
    6.   mov ax, [systime.wSecond]
    7.   push eax   ; 1
    8.   mov ax, [systime.wMinute]
    9.   push eax   ; 2
    10.   mov ax, [systime.wHour]
    11.   push eax   ; 3
    12.   mov ax, [systime.wYear]
    13.   push eax   ; 4
    14.   mov ax, [systime.wDay]
    15.   push eax   ; 5
    16.   mov ax, [systime.wMonth]
    17.   lea eax, [month-4+eax*4]
    18.   push eax   ; 6
    19.   push szFormat   ; 7
    20.   mov esi, buffer
    21.   push esi   ; 8
    22.   call [wsprintf]
    23.   add esp, (8 * 4)
     
  8. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    Asterix

    Хорошо, это прояснило ситуацию, но почему прога валиться даже если скоректировать стек при помощи "add esp, (8 * 4)" после вызова? И почему импорты надо прописывать второй раз?
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    это в моем случае, в общем случае
    add esp, количество_параметров*4

    где количество_параметров - это количество параметров которые передали в функцию wsprintf
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SiruS
    Заглянув в win32ax.inc, ты поймешь он подключает импорт
    1) через макрос .end, которого в твоем коде не видно
    2) создает для импорта отдельную секцию idata
     
  11. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    leo

    Ууууу, спасибо, это действительно помогло!
    И еще, так вопросик на засыпку: как подредактировать макрос, чтобы он не создавал свою секцию импорта, а использовал .flat и не создавал никаких неожиданостей при выполнении кода?
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SiruS
    Подключай win32a.inc, там больше контроля над прогой. Примеры, опять же, с фасмом есть.
     
  13. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    IceStudent

    Угу, спасибо. Мож вы подскажете, как правильно запхать импорт в одну секцию с кодом, а то у меня не получаеться так - прогу постоянно выбивает :dntknw:
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    создаёшь директорию импорта (а не отдельную секцию):

    data import
    library ...
    import ...
    include ...
    end data

    Так же и с другими директириями (ресурсы, экспорт, tls)
     
  15. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    IceStudent

    Спасибо, написал вот так и все заработало:

    Код (Text):
    1. data import
    2.  
    3. library kernel32,'KERNEL32.DLL',\
    4.          user32,'USER32.DLL',\
    5.          gdi32,'GDI32.DLL',\
    6.          advapi32,'ADVAPI32.DLL',\
    7.          comctl32,'COMCTL32.DLL',\
    8.          comdlg32,'COMDLG32.DLL',\
    9.          shell32,'SHELL32.DLL',\
    10.          wsock32,'WSOCK32.DLL'
    11.  
    12.      import_kernel32
    13.      import_user32
    14.      import_gdi32
    15.      import_advapi32
    16.      import_comctl32
    17.      import_comdlg32
    18.      import_shell32
    19.      import_wsock32
    20.      
    21. end data
    Блин, опять! Пару раз перекомпилил - говорит illegal instruction import_kernel32! Что за ... ?
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SiruS
    Марш читать мануал фасма (pdf), раздел 3.
     
  17. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    SiruS

    Исправился :)

    Код (Text):
    1. data import
    2.  
    3. library kernel32,'KERNEL32.DLL',\
    4.         user32,'USER32.DLL',\
    5.         gdi32,'GDI32.DLL',\
    6.         advapi32,'ADVAPI32.DLL',\
    7.         comctl32,'COMCTL32.DLL',\
    8.         comdlg32,'COMDLG32.DLL',\
    9.         shell32,'SHELL32.DLL',\
    10.         wsock32,'WSOCK32.DLL'
    11.  
    12.         include '%FASMINC%/apia/kernel32.inc'
    13.         include '%FASMINC%/apia/user32.inc'
    14.         include '%FASMINC%/apia/gdi32.inc'
    15.         include '%FASMINC%/apia/comctl32.inc'
    16.         include '%FASMINC%/apia/comdlg32.inc'
    17.         include '%FASMINC%/apia/shell32.inc'
    18.         include '%FASMINC%/apia/wsock32.inc'
    19.      
    20. end data
    З.Ы. Мануалы рулят :)
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Воистину.