p386; эта директива разрешает транслятору обрабатывать команды процессора i 386
jumps;транслятор автоматически преобразует команду условной передачи управления
;в комбинацию условной и безусловной команды, если условная в силу ограниченности;области своего действия не обеспечивает передачу управления по нужному адресу
model flat,STDCALL;выбирает модель памяти для 32-разрядного программирования и;правила передачи параметров функции STDCALL, далее действующие по умолчанию
UNICODE = 0
include win32.inc;файл, содержащий описание структур данных и констант
; some 32-bit constants and structures
L equ <LARGE>; последовательности символов LARGE, являющейся именем операции, объявляющей следующий за ней операнд 32-разрядным, присваивается имя L
Define the external functions we will be linking to
;
extrn BeginPaint:PROC; описание импортируемых из Windows функций
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn EndPaint:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn GetStockObject:PROC
extrn InvalidateRect:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn MessageBeep:PROC
extrn MessageBoxA:PROC
extrn PostQuitMessage:PROC
extrn RegisterClassA:PROC
extrn ShowWindow:PROC
extrn SetWindowPos:PROC
extrn TextOutA:PROC
extrn TranslateMessage:PROC
extrn UpdateWindow:PROC
extrn FindFirstFileA:PROC
.data;предопределенное имя, означающее начало сегмента данных
newhwnd dd 0
lppaint PAINTSTRUCT <?>
msg MSGSTRUCT <?>
wc WNDCLASS <?>
hInst dd 0
szTitleName db 'Это окно УГТУ',0
szTitleName1 db 'Это окно группы СП-923',0;'Каркасное приложение Win32 на ассемблере'.0
szClassName db 'ASMCLASS32',0;'Приложение Win32’
Buffer db 'Привет из Нягани!',0
new1hwnd dd 0
MSG_L EQU 14
.code
start:
push L 0
call GetModuleHandleA; get hmod (in eax)
mov [hInst], eax; hInstance is same as HMODULE
; in the Win32 world
reg_class:
;
; initialize the WndClass structure;Иинициализация сруктуры WndClass
;
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS;тип;класса
mov [wc.clsLpfnWndProc], offset WndProc; адрес оконной процедуры
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [hInst]
mov [wc.clsHInstance], eax;дикриптор модуля
push L IDI_APPLICATION;заданная по умолчанию пиктограмма
push L 0
call LoadIconA
mov [wc.clsHIcon], eax
push L IDC_ARROW
push L 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
push offset wc
call RegisterClassA
push L 0; lpParam
push [hInst]; hInstance
push L 0; menu
push L 0; parent hwnd
push L CW_USEDEFAULT; height
push L CW_USEDEFAULT; width
push L CW_USEDEFAULT; y
push L CW_USEDEFAULT; x
push L WS_OVERLAPPEDWINDOW; Style
push offset szTitleName; Title string
push offset szClassName; Class name;имя класса
push L 0; extra style
call CreateWindowExA
mov [newhwnd], eax
push L SW_SHOWNORMAL
push [newhwnd]
call ShowWindow
push [newhwnd]
call UpdateWindow
push L 0; lpParam
push [hInst]; hInstance
push L 0; menu
push L [newhwnd]; parent hwnd
push L CW_USEDEFAULT; height
push L CW_USEDEFAULT; width
push L CW_USEDEFAULT; y
push L CW_USEDEFAULT; x
push L WS_OVERLAPPEDWINDOW; Style
push offset szTitleName1; Title string
push offset szClassName; Class name
push L 0; extra style
call CreateWindowExA
mov [new1hwnd], eax
push L SW_SHOWNORMAL
push [new1hwnd]
call ShowWindow
push [new1hwnd]
call UpdateWindow
msg_loop:
push L 0
push L 0
push L 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
; we never get to here
;оконная процедура
;-----------------------------------------------------------------------------
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
;
; WARNING: Win32 requires that EBX, EDI, and ESI be preserved! We comply
; with this by listing those regs after the 'uses' statement in the 'proc'
; line. This allows the Assembler to save them for us.
;
LOCAL hDC:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_SIZE
je wmsize
cmp [wmsg], WM_CREATE
je wmcreate
cmp [wmsg],WM_PAINT
je wmpaint
jmp defwndproc
wmcreate:
mov eax, 0
jmp finish
defwndproc:
push [lparam]
push [wparam]
push [wmsg]
push [hwnd]
call DefWindowProcA
jmp finish
wmdestroy:
push L 0
call PostQuitMessage
mov eax, 0
jmp finish
wmsize:
mov eax, 0
jmp finish
wmpaint:
push offset lppaint
push [hwnd]
call BeginPaint
mov [hDC],eax
push L 17
; push ecx
push offset Buffer
push L 5
push L 5
push [hDC]
call TextOutA
push offset lppaint
push [hwnd]
call EndPaint
mov eax,0
jmp finish
finish:
ret
WndProc endp
;-----------------------------------------------------------------------------
public WndProc
end start