вот смотрю какие вы тут вопросы обсуждаете и стыдно задать свой. написал я эту хрень поль зуясь 3-м уроком икцелиона(но на fasm; а на фасме потому как другие компиляторы на мой комп не встают, или с моими руками...,но не суть).вот такой вот код не принимается фасмом Код (Text): format PE GUI 4.0 entry start include 'C:\program files\tools\fasmw167\include\win32a.inc' section '.data' data readable writeable caption db 'author is cool hacker',0 text db 'its coolest programm',0 mymessage db 'reaction',0 hinstance dd 0 mes db 'its a message',0 mes2 db 0 msg MSG wc WNDCLASS mes3 db 0 hwnd HWND hDC db 0 ws equ WS_VISIBLE+WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU _class db 'FCAPTION',0 hint db 'indifferently',0 section '.code' code readable executable start: invoke GetModuleHandle,0 mov [wc.hInstance],eax mov [hinstance],eax invoke LoadIcon ,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax mov [wc.style],0 mov [wc.lpfnWndProc],WindowProc mov [wc.cbClsExtra],0 mov [wc.cbWndExtra],0 mov [wc.hbrBackground],COLORWINDOW+1 mov [wc.lpszMenuName],0 mov [wc.lpszClassName],_class invoke RegisterClass,wc invoke CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL mov hwnd,eax invoke ShowWindow,hwnd,0 jmp mloop mloop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz exit invoke TranslateMessage,msg invoke DispatchMessage,msg jmp mloop exit: invoke ExitProcess,[msg.wparam] proc WindowProc,hwnd,wmsg,wparam,lparam enter push ebx esi edi cmp [wmsg],WM_DESTROY je wmdestroy invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] pop edi esi ebx ret wmdestroy: invoke PostQuitMessage,0 xor eax,eax ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' kernel: import GetModuleHandle,'GetModuleHandleA',\ ExitProcess,'ExitProcess' user: import RegisterClass,'RegisterClassA',\ CreateWindowEx,'CreateWindowExA',\ DefWindowProc,'DefWindowProcA',\ TranslateMessage,'TranslateMessage',\ DispatchMessage,'DispatchMessageA',\ LoadCursor,'LoadCursorA',\ LoadIcon,'LoadIconA',\ PostQuitMessage,'PostQuitMessage',\ пишет что illegal instruction : hwnd HWND че этому фасму не нравится?
теперь ему не нравится "mov hwnd ,eax" Код (Text): ...... invoke RegisterClass,wc invoke CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL mov hwnd,eax invoke ShowWindow,hwnd,0 jmp mloop.......
goga2007 и потом invoke ShowWindow,[hwnd],0 т.е. там где нужен не адрес переменной а её непосредственное значение, нужно заключать имя в квадратные скобки. Иногда при этом нужно указывать размер переменной. Все эти тонкости прекрасно расписаны в самом начале руководства по фасму.
undefined simbol: invoke GetModuleHandle,0 Код (Text): .... start: invoke GetModuleHandle,NULL mov [wc.hInstance],eax mov [hinstance],eax ..... никто не знает где уроки под fasm найти?
исправил вроде, появился контур окна ,но сразу исчез,а после повторной компиляции появ. ошибка: error: write failed
вот новый код Код (Text): format PE GUI 4.0 entry start include 'C:\program files\tools\fasmw167\include\win32a.inc' section '.data' data readable writeable caption db 'author is cool hacker',0 text db 'its coolest programm',0 mymessage db 'reaction',0 hinstance dd 0 mes db 'its a message',0 msg MSG wc WNDCLASS hwnd dd 0 hDC db 0 ws equ WS_VISIBLE+WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU _class db 'FCAPTION',0 hint db 'indifferently',0 section '.code' code readable executable start: invoke GetModuleHandle,NULL mov [wc.hInstance],eax mov [hinstance],eax invoke LoadIcon ,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax mov [wc.style],0 mov [wc.lpfnWndProc],WindowProc mov [wc.cbClsExtra],0 mov [wc.cbWndExtra],0 mov [wc.hbrBackground],COLOR_WINDOW+1 mov [wc.lpszMenuName],0 mov [wc.lpszClassName],_class invoke RegisterClass,wc invoke CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL mov [hwnd],eax invoke ShowWindow,[hwnd],0 jmp mloop mloop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz exit invoke TranslateMessage,msg invoke DispatchMessage,msg jmp mloop exit: invoke ExitProcess,0 proc WindowProc,hwnd,wmsg,wparam,lparam push ebx esi edi cmp [wmsg],WM_DESTROY je wmdestroy invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] pop edi esi ebx ret wmdestroy: invoke PostQuitMessage,0 xor eax,eax ret endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess,'ExitProcess' import user,\ RegisterClass,'RegisterClassA',\ CreateWindowEx,'CreateWindowExA',\ DefWindowProc,'DefWindowProcA',\ TranslateMessage,'TranslateMessage',\ DispatchMessage,'DispatchMessageA',\ LoadCursor,'LoadCursorA',\ LoadIcon,'LoadIconA',\ PostQuitMessage,'PostQuitMessage',\ ShowWindow,'ShowWindow',GetMessage,'GetMessageA'
да,да,да. ток что увидел штук 8 таких процессов в диспетчере задач. а чтоб убить его что надо сделать?(в смысле в программе; этих я уже убил)
goga2007 В догонку, 1) в стиле окна у тебя было указано WS_VISIBLE поэтому функции ShowWindow и UpdateWindow можно было и не вызывать, соответственно переменная hwnd тебе бы и не понадобилась 2) если при компиляции были заданы стандартные ключи, GetModuleHandle всегда возвращает значение 400000h поэтому можно было сразу писать mov [wc.hInstance],400000h поэтому надобности в GetModuleHandle не было 3) Для набора стандартных системных иконок и курсоров значения, возвращаемые функциями LoadCursor и LoadIcon будут одними и теми же, и в Win98 и WinXp разных SP, проверял! mov [wc.hIcon],10003h ;Иконка окна по умолчанию mov [wc.hCursor],10011h ;Курсор окна по умолчанию 4) Если не обрабатываются сообщение клавиатуры TranslateMessage не нужен 5) 90% приложений, и твое в том числе, можно закончить обычным ret вместо ExitProcess 6) в WindowProc значения ebx esi edi не изменялись, поэтому push и pop ни к чему 7) функции DefWindowProc передаются те же параметры что и для функции WindowProc поэтому достаточно будет поставить jmp вместо invoke, что избавляет тебя еще и от ret 10h 8) Чем короче код, тем меньше ошибок!!!
подскажите где почитать про стандартные ключи и ваще шо це таке? действительно все работает и без этих функций(а я думал,что работать стало из-за АПДЕЙТа) у меня почемуто они обрабатываются и без него(в левом верх. углу выпадает контекст.меню) ваще я пришел поделиться опытом с теми,кто тоже начал изучать асм с фасма и ищет код первого окна, а оказывается у меня там все криво - не буду его оставлять.
В фасме появились какие-то ключи? goga2007 Посмотрите в MSDN описание функции TranslateMessage и Вы поймёте зачем и нужна ли она Вам.
и ещё максимальное количество проходов, вроде. Что-то ещё было, но я не помню, надо в справку глянуть В фасме почти всё задается директивами в сорце.