;пример окна в MASM:
.386 ;берём минимум
.model flat, stdcall ;модель памяти-плоская, соглашение о вызовах OC Windows*
option casemap:none ;следим за регистром букв в метках и именах процедур;библиотеки и импорт, можно вынести в inc-файл
includelib disk:\masm32\lib\kernel32.lib
includelib disk:\masm32\lib\user32.lib
includelib disk:\masm32\lib\gdi32.lib
include disk:\masm32\include\windows.inc
include disk:\masm32\include\kernel32.inc
include disk:\masm32\include\user32.inc
include disk:\masm32\include\gdi32.inc
;объявим процедуры, можно вынести в inc-файл
WinMain proto stdcall :DWORD, :DWORD, :DWORD, :DWORD
WndProc proto stdcall :DWORD, :DWORD, :DWORD, :DWORD
.data?
hInstance dd ? ;дескриптор программы, не содержит определённого значения
.data ; имя тип операнды: 1-й, 2-й ...объявляем простые переменные
ClassName db "FirstWindowClass",0
HeadName db "Арифмометр от Cupoma",0
AppName db "Добро пожаловать в арифмометр!",0
.code
go: ;следующие 4 строчки и есть сама программа
invoke GetModuleHandle,NULL ;берём идентификатор текущего модуля, invoke - аналог call
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWNORMAL ;запусаем приложение
invoke ExitProcess,NULL ;выходим;главная процедура, её и вызываем при запуске:WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD ;**
LOCAL wc:WNDCLASSEX ;создаём локальные переменные (работают только внутри процедуры)
LOCAL hwnd:DWORD
LOCAL msg:MSG
;заполним свойства класса нашего будущего окна (всё в API Reference)
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,0Fh ;окно будет белым
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset ClassName
;иконка должна быть в файле rsrc.rc и иметь идентификатор IDI_APPLICATION, (по желанию)
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
;курсор тоже должен быть в файле rsrc.rc, его идентификатор — IDC_ARROW, (по желанию)
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc ;создадим класс;создадим основное окно: WS_ .. — определяют то, как оно будет выглядеть***
invoke CreateWindowEx,NULL,addr ClassName,addr HeadName,\
WS_OVERLAPPEDWINDOW-WS_SIZEBOX-WS_MAXIMIZEBOX,CW_USEDEFAULT,\
CW_USEDEFAULT,400,300,NULL,NULL,\
hInst,NULL
mov hwnd,eax ;запишем его идентификатор в hwnd
invoke ShowWindow,hwnd,SW_SHOWNORMAL ;выведем окно на экран
invoke UpdateWindow,hwnd ;и перерисуем его
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw ;выходим из программы по закрытию окна
mov eax,msg.wParam
ret ;обязательный возврат из процедуры, передача управленияWinMain endp
;оконная процедура (вызываеися в главной):WndProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,uMsg
push esi ;сохраним используемые регистры
push edi
push ebx
.if eax==WM_CREATE ;сообщение, переданое при создании окна
invoke MessageBox,NULL,addr AppName,addr HeadName,NULL ;попутно создадим форточку
.elseif eax==WM_DESTROY ;при удалении окна
invoke PostQuitMessage,NULL ;сообщение, переданое при завершение работы окна
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ;все остальные сообщения - не обрабатываем
.endif
pop ebx ;восстановим сохранённые в начале регистры
pop edi
pop esi
ret ;обязательны возврат из процедуры, передача управленияWndProc endp
end go
;*всю память можно рассматривать как один сегмент, адрес любой ячейки памяти будет определяться;содержимым одного 32-битного регистра и выделение в тексте программы сегмента кода и сегмента;данных является теперь простой формальностью, улучшающей читаемость программы,;соглашения о вызовах определяют порядок (в братном порядке) передачи параметров и порядок очистки;стека (очищается процедурой);**проще обpащаться к этим паpаметpам, вместо того, чтобы манипулиpовать со стеком,;а MASM будет генеpиpовать пpологовый и эпилоговой код для функции;***по этому принципу мы будем создавать кнопки и окно редактирования (дисплей) - предопределённые классы
рис.7