;пример окна в 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