(5): i can not find "include windows.inc" - не компилируется кодоворот - Assembler
Формулировка задачи:
.386 .model flat,stdcall option casemap:none ; Подключаем необходимые библиотеки и описания их структур и функций include windows.inc include user32.inc include kernel32.inc include gdi32.inc include comdlg32.inc includelib windows.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib includelib comdlg32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD; описываем прототип функции -для функции WinMain объявлюются 4 переменные размером двойное слово, которые использует функция ;далее при вызове этой функции в программе следуют 4 параметра дескриптор текущего экземпляра окна дескриптор предыдущего экземпляра окна указатель на командную строку показывает состояние окна ; Макрос, заносящий значения компонент палитры в регистр EAX RGB macro red,green,blue mov eax,blue shl 16 + green shl 8 + red endm ; Макрос для вставки текста szText MACRO Name,Text:VARARG ;vararg. Это означает, что все, что указанно при вызове макроса в качестве параметров присваивается этому параметру как единая текстовая строка. .data Name db Text,0 ;Директива NAME обеспечивает другой способ назначения имени модулю. Задает имя модуля объектного файла. В режиме MASM эта директива не действует, она работает только в режиме Ideal. .code endm .const button1ID equ 1 .data? hwndbutton1 HWND ? hInstance HINSTANCE ? CommandLine LPSTR ? .data Textbutton1 db "Button1",0 ;_______________ ClassName db "MASM Builder",0 BtnClName db "button",0 StatClName db "static",0 EditClName db "edit",0 LboxClName db "listbox",0 CboxClName db "combobox",0 ReditClName db "richedit",0 RichEditLib db "riched32.dll",0 Caption db "Form",0 ;_______________ .code start: ; Получаем описатель нашего модуля invoke GetModuleHandle,NULL ;Если этот параметр - NULL, GetModuleHandle возвращает дескриптор файла, используемый, чтобы создать вызывающий процесс (.exe файл). mov hInstance,eax ; Получаем адрес командной строки invoke GetCommandLine ; Вызываем главную процедуру в стиле C++ invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT; 4 параметр Определяет, как окно должно быть показано ; Завершаем процесс invoke ExitProcess,eax ; Главная процедура в стиле C++ WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD ;метка proc тип язык USES регистры ,ret ,метка endp LOCAL wc :WNDCLASSEX ;директива LOCAL нужна дял объявления локальный переменных с процедурах. Локальные переменные содержатся в стеке и существуют только во время выполнения процедуры. LOCAL msg :MSG LOCAL hwnd :HWND ; Заполняем структуру WNDCLASSEX, хранящую информацию о создаваемом классе окон mov wc.cbSize,SIZEOF WNDCLASSEX ; размер структуры mov wc.style,CS_HREDRAW or CS_VREDRAW ; стиль окна mov wc.lpfnWndProc,OFFSET WndProc ; адрес процедуры обработки сообщений mov wc.cbClsExtra,NULL ; кол-во дополнительных байт за структурой класса (0) mov wc.cbWndExtra,NULL ; кол-во дополнительных байт за экземпляром окна (0) push hInst pop wc.hInstance ; описатель экземпляра процесса с процедурой обработки сообщений RGB 235,233,216 ; EAX = код серо-бежевого цвета invoke CreateSolidBrush,eax ; создаём кисть заполнения однородным цветом EAX mov wc.hbrBackground,eax ; кисть для заполнения фона (серо- бежевым цветом) 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 ; курсор мыши в области окна mov wc.lpszMenuName,NULL ; имя или идентификатор меню (0) ; Регистрируем класс и создаём окно invoke RegisterClassEx,addr wc invoke CreateWindowEx,0,ADDR ClassName,ADDR Caption,WS_SYSMENU or WS_SIZEBOX,389,82,327,200,0,0,hInst,0 ; Показываем окно mov hwnd,eax INVOKE ShowWindow,hwnd,SW_SHOWNORMAL INVOKE UpdateWindow,hwnd ; Цикл обработки сообщений (стандартный) .WHILE TRUE INVOKE GetMessage,ADDR msg,0,0,0 ; ожидаем и получаем сообщение .BREAK .IF (!eax) ; выходим из цикла, если получаем WM_QUIT (выход из приложения) INVOKE TranslateMessage,ADDR msg ; преобразуем символьные сообщения INVOKE DispatchMessage,ADDR msg ; обрабатываем сообщение .ENDW mov eax,msg.wParam ret WinMain endp ; Процедура обработки сообщений WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg == WM_DESTROY ; сообщение об уничтожении окна (передаётся во время закрытия окна) invoke PostQuitMessage,NULL ; отправляем в очередь сообщение WM_QUIT .ELSEIF uMsg == WM_CREATE ; сообщение о создании окна (передаётся после создания окна) ; создаём кнопку с идентификатором = button1ID (кнопка - это тоже окно) invoke CreateWindowEx,0,ADDR BtnClName,ADDR Textbutton1,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,114,71,75,25,hWnd,button1ID,hInstance,0 mov hwndbutton1,eax ; сохраняем описатель кнопки .ELSEIF uMsg == WM_COMMAND ; сообщение о команде (например, нажатии на кнопку) mov eax,wParam .IF lParam != 0 ; описатель контрола (равен нулю, если это НЕ контрол формы) .IF ax == button1ID ; младшее слово wParam определяет идентификатор контрола shr eax,16 .IF ax == BN_CLICKED ; старшее слово wParam определяет код команды ; Выводим на экран сообщение invoke MessageBox,hWnd,addr Textbutton1,NULL,MB_ICONINFORMATION .ENDIF .ENDIF .ENDIF; .ELSE ; другое сообщение ; Вызываем стандартный обработчик сообщения invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ; сообщение обработано ret WndProc endp end start ; Конец программы с указанием точки в
Решение задачи: «(5): i can not find "include windows.inc" - не компилируется кодоворот»
textual
Листинг программы
\masm32\include\ user32.inc
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д