Добрый вечер ! Не так давно , начал изучать АСМ . Пока смутно представляю с чем имею дело . Прочитал "Введение в машинный код" немного начал ловить азы... Сейчас занял свой мозг изучением уроков от Iczelion'а , программирование под win32. Так вот , перейду ближе к делу . В уроке номер 3 есть пример создания окна . Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ; initialized data ClassName db "SimpleWinClass",0 ; Имя нашего класса окна AppName db "Our First Window",0 ; Имя нашего окна .DATA? ; Hеиницилизиpуемые данные hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы 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 При ассемблировании кода получаю следующие ошибки: Код (Text): Assembling: C:\ASM\aaa.asm C:\ASM\aaa.asm(36) : error A2111: conflicting parameter definition C:\ASM\aaa.asm(41) : error A2008: syntax error : HINSTANCE C:\ASM\aaa.asm(42) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\ASM\aaa.asm(43) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\ASM\aaa.asm(44) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL C:\ASM\aaa.asm(65) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(65) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(80) : error A2006: undefined symbol : CmdShow C:\ASM\aaa.asm(80) : error A2114: INVOKE argument type mismatch : argument : 2 C:\ASM\aaa.asm(80) : error A2006: undefined symbol : hwnd C:\ASM\aaa.asm(80) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(81) : error A2006: undefined symbol : hwnd C:\ASM\aaa.asm(81) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(84) : error A2006: undefined symbol : msg C:\ASM\aaa.asm(84) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(86) : error A2006: undefined symbol : msg C:\ASM\aaa.asm(86) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(87) : error A2006: undefined symbol : msg C:\ASM\aaa.asm(87) : error A2114: INVOKE argument type mismatch : argument : 1 C:\ASM\aaa.asm(47) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(48) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(49) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(50) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(52) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(54) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(55) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(57) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(58) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(60) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(62) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(64) : error A2006: undefined symbol : wc C:\ASM\aaa.asm(78) : error A2006: undefined symbol : hwnd C:\ASM\aaa.asm(90) : error A2006: undefined symbol : msg В качестве компилятора использую MASM32, пишу в редакторе MASM32 Editor. Спасибо.
Попробуй из командной строки так: %masmbin%\ml /c /coff /Cp /nologo /I"%incpath%" /Fo %fname%.obj %fname%.asm %masmbin%\link /release /version:4.0 /subsystem:windows /libpath:"%libpath%" /out:%fname%.exe %fname%.obj где: %masmbin% - путь к папке \masm32\bin %incpath% - путь к папке \masm32\include %libpath% - путь к \masm32\lib %fname% - название исходного файла (без расширения).
Аа, а зачем вы между "WinMain" и "hInst" сделали здесь перенос строки? надо так: Код (Text): WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке LOCAL msg:MSG LOCAL hwnd:HWND
О , спасибо . Я пока не совсем адекватен в АСМ чтоб самостоятельно найти ошибку =) Дай бог вам здоровечка +)))