Assembler: Создание окна
 Я взял пример программы Wap32.asm из пакета TASM и несколько упостил ее.
 
 .386
 .model flat, stdcall
 include win32.inc
 Файл win32.inc содержит некоторые нужные константы и структуры
 
 extrn CreateWindowExA:PROC
 extrn DefWindowProcA:PROC
 extrn DispatchMessageA:PROC
 extrn ExitProcess:PROC
 extrn GetMessageA:PROC
 extrn GetModuleHandleA:PROC
 extrn LoadCursorA:PROC
 extrn LoadIconA:PROC
 extrn PostQuitMessage:PROC
 extrn RegisterClassA:PROC
 extrn ShowWindow:PROC
 extrn TranslateMessage:PROC
 extrn UpdateWindow:PROC
 
 
 .data
 
 newhwnd dd 0
 msg MSGSTRUCT <?>
 wc WNDCLASS <?>
 hInst dd 0
 szTitleName db 'Win32 Assembly Program',0
 szClassName db 'ASMCLASS32',0
 
 .code
 start:
 
 push 0
 call GetModuleHandleA
 mov [hInst], eax
 Получим дискриптор программы.
 Далее инициализируем структуру WndClass для регистрации окна
 
 mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
 clsStyle - определяет стиль класса
 
 mov [wc.clsLpfnWndProc], offset WndProc
 clsLpfnWndProc - указывает на процедуру окна
 
 mov [wc.clsCbClsExtra], 0
 mov [wc.clsCbWndExtra], 0
 
 mov eax, [hInst]
 mov [wc.clsHInstance], eax
 clsHInstance - содержит дискриптор программы
 
 push IDI_APPLICATION
 push 0
 call LoadIconA
 mov [wc.clsHIcon], eax
 
 push IDC_ARROW
 push 0
 call LoadCursorA
 mov [wc.clsHCursor], eax
 
 mov [wc.clsHbrBackground], COLOR_WINDOW + 1
 mov dword ptr [wc.clsLpszMenuName], 0
 mov dword ptr [wc.clsLpszClassName], offset szClassName
 clsLpszClassName - определяет имя класса окна
 
 push offset wc
 call RegisterClassA
 Создаем окно:
 
 push 0
 push [hInst] ; дискриптор окна
 push 0
 push 0
 push CW_USEDEFAULT ; высота
 push CW_USEDEFAULT ; ширина
 push CW_USEDEFAULT ; y
 push CW_USEDEFAULT ; x
 push WS_OVERLAPPEDWINDOW ; стиль
 push offset szTitleName ; заголовок окна
 push offset szClassName ; имя класса
 push 0 ; дополнительный стиль
 
 call CreateWindowExA
 
 mov [newhwnd], eax
 newhwnd - дискриптор окна
 Покажем окно:
 
 push SW_SHOWNORMAL
 push [newhwnd]
 call ShowWindow
 Обновим окно:
 
 push [newhwnd]
 call UpdateWindow
 Создаем цикл для обработки сообщений окна
 
 msg_loop:
 push 0
 push 0
 push 0
 push offset msg
 call GetMessageA
 
 cmp ax, 0
 je end_loop
 
 push offset msg
 call TranslateMessage
 
 push offset msg
 call DispatchMessageA
 
 jmp msg_loop
 
 end_loop:
 выход из программы:
 
 push [msg.msWPARAM]
 call ExitProcess
 Процедура окна:
 
 WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
 wparam:DWORD, lparam:DWORD
 Win32 требует, чтобы EBX, EDI, и ESI были сохранены
 
 cmp [wmsg], WM_DESTROY
 je wmdestroy
 
 push [lparam]
 push [wparam]
 push [wmsg]
 push [hwnd]
 call DefWindowProcA
 jmp finish
 
 wmdestroy:
 push 0
 call PostQuitMessage
 mov eax, 0
 finish:
 ret
 WndProc endp
 ends
 end start
   
