вообщем под ос калашникова учебник освоил и внял так сказать сечас выдалась свободная минутка слил с wasm.ru изеслона туториал под win32 как кодить второй урок почемуто не компилится сам код .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib WinMain proto WORD,WORD,WORD,WORD .DATA ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? .CODE ; Здесь начинается наш код start: invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы ; Под Win32, hmodule==hinstance mov ; hInstance,eax mov hInstance,eax invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны ; вызывать эту функцию если ваша ; пpогpамма не обpабатывает командную стpоку. mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess, eax ; Выйти из пpогpаммы. ; Возвpащаемое значение, помещаемое в eax, ; беpется из WinMain. WinMain proc Inst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShowWORD LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ; pегистpация нашего класса окна invoke CreateWindowEx,NULL,\ ADDR ClassName,\ ADDR AppName,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ hInst,\ NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе invoke UpdateWindow, hwnd ; обновить клиентскую область .WHILE TRUE ; Enter message loop invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ; сохpанение возвpащаемого значения в ; eax ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY ; если пользователь закpывает окно invoke PostQuitMessage,NULL ; выходим из пpогpаммы .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция ; обpаботки окна ret .ENDIF xor eax,eax ret WndProc endp end start вот что выдает компилятор Assembling: C:\test.asm C:\test.asm(35) : error A2111: conflicting parameter definition C:\test.asm(37) : error A2008: syntax error : HINSTANCE C:\test.asm(39) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\test.asm(40) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\test.asm(41) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\test.asm(58) : error A2006: undefined symbol : wc C:\test.asm(58) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(59) : error A2006: undefined symbol : hInst C:\test.asm(59) : error A2114: INVOKE argument type mismatch : argument : 11 C:\test.asm(73) : error A2006: undefined symbol : CmdShow C:\test.asm(73) : error A2114: INVOKE argument type mismatch : argument : 2 C:\test.asm(73) : error A2006: undefined symbol : hwnd C:\test.asm(73) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(74) : error A2006: undefined symbol : hwnd C:\test.asm(74) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(76) : error A2006: undefined symbol : msg C:\test.asm(76) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(78) : error A2006: undefined symbol : msg C:\test.asm(78) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(79) : error A2006: undefined symbol : msg C:\test.asm(79) : error A2114: INVOKE argument type mismatch : argument : 1 C:\test.asm(43) : error A2006: undefined symbol : wc C:\test.asm(44) : error A2006: undefined symbol : wc C:\test.asm(45) : error A2006: undefined symbol : wc C:\test.asm(46) : error A2006: undefined symbol : wc C:\test.asm(47) : error A2006: undefined symbol : wc C:\test.asm(49) : error A2006: undefined symbol : wc C:\test.asm(50) : error A2006: undefined symbol : wc C:\test.asm(51) : error A2006: undefined symbol : wc C:\test.asm(52) : error A2006: undefined symbol : wc C:\test.asm(54) : error A2006: undefined symbol : wc C:\test.asm(55) : error A2006: undefined symbol : wc C:\test.asm(57) : error A2006: undefined symbol : wc C:\test.asm(72) : error A2006: undefined symbol : hwnd C:\test.asm(82) : error A2006: undefined symbol : msg ’®¬ ў гбва®©б⢥ C *Ґ Ё¬ҐҐв ¬ҐвЄЁ. ‘ҐаЁ©*л© *®¬Ґа ⮬*: 3438-BA06 ‘®¤Ґа¦Ё¬®Ґ Ї*ЇЄЁ C:\ 03.03.2007 21:43 2я667 test.asm 1 д*©«®ў 2я667 Ў*©в 0 Ї*Ї®Є 437я686я272 Ў*©в бў®Ў®¤*® какя то лажа при вызове winmain что не так у него пока сам понять еще не в состоянии
Там допущена всего одна ошибка, произащедшая скорее всего во время того как ты копипастил код Ты её найдёшь без проблем, если сравнишь этот сорец с практически любым другим из примеров
В след раз, ставь тег "CODE" (у меня стоко ошибок было) а опечатка то всего одна Code: .386 .model flat, stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? .CODE ; Здесь начинается наш код start: invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы ; Под Win32, hmodule==hinstance mov ; hInstance,eax mov hInstance,eax invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны ; вызывать эту функцию если ваша ; пpогpамма не обpабатывает командную стpоку. mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess, eax ; Выйти из пpогpаммы. ; Возвpащаемое значение, помещаемое в eax, ; беpется из WinMain. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ; pегистpация нашего класса окна invoke CreateWindowEx,NULL,\ ADDR ClassName,\ ADDR AppName,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ hInst,\ NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow ; отобpазить наше окно на десктопе invoke UpdateWindow, hwnd ; обновить клиентскую область .WHILE TRUE ; Enter message loop invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ; сохpанение возвpащаемого значения в ; eax ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY ; если пользователь закpывает окно invoke PostQuitMessage,NULL ; выходим из пpогpаммы .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция ; обpаботки окна ret .ENDIF xor eax,eax ret WndProc endp end start
незнаю... я не читаю посты я просто так пишу а вот упрёк masm нахуя они придумали "типы" HINSTANCE, LPSTR, DWORD ? помоему смысл понимания ассемблерного кода - достучаться до задней точки мозга дабы обьяснить что все это dd, dword - 4байта (в 32-б с-мах) ну пусть ещё сделают LPCTSTR2 которая будет dword и SUPERPUPERTYPE который будет значит также dword и MY_KAK_BI_DWORD который тоже dword upd ваш хэк форум смайлики не в тему ставит ...
сам не знаю))) может максимально к си хотели приблизить, там еще больше, мне не понятных типов, и звёздочек, рюшечек всяких скорее всего для простоты понимания, чтоб сразу было видно, hInstance - хэндл
Поэтому я и нелюблю masm'ом и С++, помимо этих типов ещё это обьявление функций зараннее, тоже чушь ИМХО, но если человеку нравится мучить себя этой дрянью, почему бы и не помочь Пусть сам сделает свой выбор.
пускай в си плюс плюс все останется - там это как раз очень к месту и удобно потому что это все-таки язык и там не нужно видеть самую суть. ассемблер же втупую набор заранее известных инструкций.
Тот же самый пример, зачем в c++ HINSTANCE, LPSTR, DWORD они ведь всё-равно значат одно и тоже, но не дают подставить одно в другое без изменения типа, в чём тогда смысл? Вот Perl вот это язык, никаких типов и никакой сути.
Дело как раз в том что там они не значат одно и тоже. С-код - это схема. Схема приложения. Части этой схема работают с разными данными, соответственно разных типов. Тип LPSTR - указатель на строку, а DWORD - положительное 4-байтное значение. Хоть указатель тоже четырехбайтный, нужно знать где передать указатель, где хенлд, а где просто число. Если кодер начинает использовать для разработки "напрямую" ассемблер - он соглашается использовать один тип (реальный, настоящий, тут у нас dword) для описания того что раньше делал кучей других, описаных в Win SDK. Так нафига же ему обратно впихивать то что он только что согласился забыть, чтобы успешно кодить на асм?