А с подключением '%FASMINC%\win32ax.inc' это разве еще и вручную надо дописывать? Зачем писать то же 2 раза? Как написал второй раз, скомпилилось, но при выполнении дает ошибку.
Блин, никак понять не могу почему не хочет работать. Вот листинг, кому несложно, гляньте на него, там пара инструкций и куча головной боли Код (Text): format PE GUI 4.0 include '%FASMINC%\win32ax.inc' start: inc [count] push count push szformat push filename call [wsprintf] push NULL push FILE_ATTRIBUTE_NORMAL push OPEN_ALWAYS push NULL push NULL push GENERIC_WRITE push filename call CreateFile push eax call CloseHandle jmp start ; Never exit count dd 0 filename rd 15h szformat db '%i',0 ;data import ; ;library kernel32,'KERNEL32.DLL',\ ; user32,'USER32.DLL' ; ;import kernel32,\ ; CreateFile,'CreateFileA',\ ; CloseHandle,'CloseHandle' ; ;import user32,\ ; wsprintf,'wsprintfA' ; ;end data импорт я специально оформил в коменты, так как импорт подключается из win32ax.inc И еще, я специально хочу сделать односекционную программу, знаю что в фасме это не проблема.
SiruS смотри примеры в дистрибутиве фасма через call импортируемые функции вызываются так call [имя_функции] что касается wsprintf то это впридачу cdecl функция, поэтому если ты ее вызываешь не через cinvoke то необходима коррекция стека, например Код (Text): invoke GetLocalTime, ebx virtual at ebx systime SYSTEMTIME end virtual xor eax, eax mov ax, [systime.wSecond] push eax ; 1 mov ax, [systime.wMinute] push eax ; 2 mov ax, [systime.wHour] push eax ; 3 mov ax, [systime.wYear] push eax ; 4 mov ax, [systime.wDay] push eax ; 5 mov ax, [systime.wMonth] lea eax, [month-4+eax*4] push eax ; 6 push szFormat ; 7 mov esi, buffer push esi ; 8 call [wsprintf] add esp, (8 * 4)
Asterix Хорошо, это прояснило ситуацию, но почему прога валиться даже если скоректировать стек при помощи "add esp, (8 * 4)" после вызова? И почему импорты надо прописывать второй раз?
это в моем случае, в общем случае add esp, количество_параметров*4 где количество_параметров - это количество параметров которые передали в функцию wsprintf
SiruS Заглянув в win32ax.inc, ты поймешь он подключает импорт 1) через макрос .end, которого в твоем коде не видно 2) создает для импорта отдельную секцию idata
leo Ууууу, спасибо, это действительно помогло! И еще, так вопросик на засыпку: как подредактировать макрос, чтобы он не создавал свою секцию импорта, а использовал .flat и не создавал никаких неожиданостей при выполнении кода?
IceStudent Угу, спасибо. Мож вы подскажете, как правильно запхать импорт в одну секцию с кодом, а то у меня не получаеться так - прогу постоянно выбивает
создаёшь директорию импорта (а не отдельную секцию): data import library ... import ... include ... end data Так же и с другими директириями (ресурсы, экспорт, tls)
IceStudent Спасибо, написал вот так и все заработало: Код (Text): data import library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ gdi32,'GDI32.DLL',\ advapi32,'ADVAPI32.DLL',\ comctl32,'COMCTL32.DLL',\ comdlg32,'COMDLG32.DLL',\ shell32,'SHELL32.DLL',\ wsock32,'WSOCK32.DLL' import_kernel32 import_user32 import_gdi32 import_advapi32 import_comctl32 import_comdlg32 import_shell32 import_wsock32 end data Блин, опять! Пару раз перекомпилил - говорит illegal instruction import_kernel32! Что за ... ?
SiruS Исправился Код (Text): data import library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ gdi32,'GDI32.DLL',\ advapi32,'ADVAPI32.DLL',\ comctl32,'COMCTL32.DLL',\ comdlg32,'COMDLG32.DLL',\ shell32,'SHELL32.DLL',\ wsock32,'WSOCK32.DLL' include '%FASMINC%/apia/kernel32.inc' include '%FASMINC%/apia/user32.inc' include '%FASMINC%/apia/gdi32.inc' include '%FASMINC%/apia/comctl32.inc' include '%FASMINC%/apia/comdlg32.inc' include '%FASMINC%/apia/shell32.inc' include '%FASMINC%/apia/wsock32.inc' end data З.Ы. Мануалы рулят