Всем привет! Пишу программу для работы с файлами. Поскольку я только учусь, не могу найти ошибку. CreateFileA прыгает на какой-то адрес. Догадываюсь, что проблема в lparam, но исправить не могу. Подскажите, где у меня ошибка: include '../include/win32ax.inc' .data lparam db "test.txt",0 text db "Hello",0 .code start: pusha push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push 0 push FILE_SHARE_READ + FILE_SHARE_WRITE push GENERIC_READ + GENERIC_WRITE push lparam call CreateFileA xor ebx,ebx invoke WriteFile,eax,text,5,0,0 pop eax invoke CloseHandle,eax invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Win32 Assembly",MB_OK invoke ExitProcess,0 .end start Заранее спасибо.
include '../include/win32ax.inc' .data lparam db "test.txt",0 text db "Hello",0 nRealWrite dd 0 .code start: push 0 push FILE_ATTRIBUTE_NORMAL push OPEN_EXISTING push 0 push FILE_SHARE_READ + FILE_SHARE_WRITE push GENERIC_READ + GENERIC_WRITE push offset lparam call CreateFileA cmp eax,INVALID_HANDLE_VALUE je @F push eax invoke WriteFile,eax,addr text,5,addr nRealWrite,0 call CloseHandle invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Win32 Assembly",MB_OK @@: invoke ExitProcess,0 .end start Сложилось впечатление что писал в IDE, а она ругалась на CreateFile пэтому решил call написать. Читай описание функций внимательней.
Спасибо за помощь, но я пишу на фасме, который директивы offset не поддерживает. Писалась прога на ide, согласен. Но теперь жалуется на offset и наотрез отказывается компилить. Что делать?
ukrlanser_2009 FASM не знаю Попробуй offset убрать. На addr не ругается? И зачем начинать с такого гемора как FASM?
ну оффсет убери - у тебя и без него вроде правильно все для фасма написано. А вот первую инструкцию оставь все-таки push 0, а не pusha. Подозреваю, что, посылая в стек все регистры через pusha, ты запихнул туда какое-то левое число, по которому CreateFileA пыталась что-то записать. А когда не получилось записать, в ольке у тебя вывалился эксепшн. Так что замени сначала первую инструкцию, а там посмотрим.
MirrorBlack бггг, точно я твой код смотрю, а говорю, что все в порядке )) вобщем, сидеть ТС в ольке еще долго и долго
MirrorBlack Хм, что-то я не вижу импорта... может проблема в нём? и Вот этого на надо писать в фасме... Вот из-за такой фигни фасм может визжать и нервно дёргать окончаниями Фасм известный приколист... если, например, портировать из масма и не переделать определение proc-a, то фасм всё скомпилирует, пока вы не захотите вызвать эту функцию через инвок. Но сути проблемы вам при этом не расскажет, а будет писать что-то невнятное и догадаться в чём проблема будет невозможно (догадаться можно только через инсайт и глубокую медитацию).... Совет: если фасм впадает в истерику, а вы не можете понять причину, то просто закомментируйте причину нервных воплей. И вот так, комментируя всё подряд, под конец вы возможно дойдёте до истины, 50 на 50 . Только если вышеперечисленное является злым умыслом. Остаётся лишь надеяться, что когда-нибудь его наделят надлежащим интеллектом. А то тупое развёртывание макроса при ошибке заставляет меня просто выпасть в осадок . Чуть не забыл, offset в фасме писать не надо. А вот addr надо только тогда, когда вы адресуите локальную переменную, тогда фасм разворачивает её в lea. В общем всё просто: Если надо запушить значение переменной, то тогда используются квадратные скобки ([variable]). Если это "lp", то ничего не надо писать, если это не локальная переменная.
да что ж вы все так смещений боитесь это походу единственный плюс в сторону фасма )) ладно, дальше на реплику отвечать не буду, а то начнется холивар
Код (Text): macro .end label { entry label section '.idata' import data readable writeable 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 all_api } На fasm не гнать, просто раз уж решили использовать макросы, идущие в комплекте с fasm'ом, нужно детально в них разобраться, ну и писать внимательно, а не абы как.
Сколько пишу на фасме, а этого не знал. Я импорт специальной тулзой составляю (scan, по-моему), его потом только ручками подрихтовать и всё нормально. Жаль, что тулза без сырцов идёт, а то "кернел32" на "кернел" менять каждый раз немного надоедает. Каждый раз нажимать на капслок и набирать OFFSET меня немного напрягает. У меня вместо DWORD,WORD,BYTE просто D,W,B... пересилил себя и накатал макрос, намного удобнее стало и быстрее писать )). Не говоря уже о компактности, а в случае асма - это критично потому, что существует предел строк, которые в состоянии удерживать программист в уме. Далеко не единственный, мне он нравиться потому, что у него идеология такая: "Закат солнца вручную...". Люблю всё контролировать, а теже Кресты мне не дают поизвращаться как следует. Я писал как-то в них с использованием гди плюс, так код получился такой, что мне самому стало противно. Столько лишних телодвижений, что жутко просто, а по другому просто никак.... Ну-у-у-у, почти никак, можно было использовать гди плюс флат апи, но смысл тогда писать на крестах?
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) я конечно дико-предико извиняюсь, но какое отношение твой капслок имеет к масму? ну вообще я имел ввиду плюс фасма по сравнению с масмом, а не с си. Но не важно, холивар разводить не стану.