b>; послідовності символів LARGE, p>
; що є ім'ям операції, що оголошує p>
; наступний за нею операнд 32-розрядних, p>
; присвоюється ім'я L p>
IDM_QUIT equ 100 b> p>
IDM_ABOUT equ 101 b> p>
MF_ENABLED equ 0 b> p>
MF_POPUP equ 10h b> p>
MF_OWNERDRAW equ 100h b> p>
b> ; Опції Win32 API, які використовуються програмою b> p>
b> extrn BeginPaint: PROC b> p>
extrn CreateWindowExA: PROC b> p>
extrn DefWindowProcA: PROC b> p>
extrn DispatchMessageA: PROC b> p>
extrn EndPaint: PROC b> p>
extrn ExitProcess: PROC b> p>
extrn GetMessageA: PROC b> p>
extrn GetModuleHandleA: PROC b> p>
extrn LoadCursorA: PROC b> p>
extrn LoadIconA: PROC b> p>
extrn RegisterClassA: PROC b> p>
extrn PostQuitMessage: PROC b> p>
extrn ShowWindow: PROC b> p>
extrn TranslateMessage: PROC b> p>
extrn UpdateWindow: PROC b> p>
extrn CreateMenu: PROC b> p>
extrn MessageBoxA: PROC b> p>
extrn AppendMenuA: PROC b> p>
extrn DrawMenuBar: PROC b> p>
extrn CreatePopupMenu: PROC b> p>
b> . data b>; перевизначених ім'я, що означає початок сегмента p>
b>; даних p>
newhwnd dd 0 b> p>
b> lppaint PAINTSTRUCT > b> p>
msg MSGSTRUCT > b> p>
wc WNDCLASS > b> p>
hInst dd 0 b> p>
fl dw 0 b> p>
szTitleName db ' b> Це b> b> наше b> b> вікно b > ', 0 b> p>
szClassName db 'ASMCLASS32', 0 b> p>
b> szHello db 'Hello!', 0 b> p>
szAppName db 'Повідомлення', 0 b> p>
b> hMenu dd 0 b> p>
hsubmenu dd 0 b> p>
item1 db ' b> Меню b> ', 0 b> p>
item2 db ' b> Вихід b> ', 0 b> p>
b> item3 db 'Повернення', 0 b> p>
. code b>; перевизначених ім'я, що означає початок p>
; сегменту коду p>
start: b> p>
b> push L 0 b> p>
call GetModuleHandleA b> p>
b> mov [hInst], eax b> p>
; ініціалізація структури WndClass b> p>
b> p>
b> mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + b> p>
CS_GLOBALCLASS b> p>
mov [wc.clsLpfnWndProc], offset WndProc b> p>
mov [wc.clsCbClsExtra], 0 b> p>
mov [wc.clsCbWndExtra], 0 b> p>
mov eax, [hInst] b> p>
mov [wc.clsHInstance], eax b> p>
push L IDI_APPLICATION b> p>
push L 0 b> p>
call LoadIconA b> p>
mov [wc.clsHIcon], eax b> p>
push L IDC_ARROW b> p>
push L 0 b> p>
call LoadCursorA b> p>
mov [wc.clsHCursor], eax b> p>
mov [wc.clsHbrBackground], COLOR_WINDOW + 1 b> p>
mov dword ptr [wc.clsLpszMenuName], 0 b> p>
mov dword ptr [wc.clsLpszClassName], offset szClassName b> p>
push offset wc b> p>
call RegisterClassA b> p>
call CreateMenu b> p>
mov [hMenu], eax b> p>
push L 0; lpParam b> p>
push [hInst]; hInstance b> p>
push [hMenu]; menu b> p>
push L 0; parent hwnd b> p>
push L CW_USEDEFAULT; height b> p>
push L CW_USEDEFAULT; width b> p>
push L CW_USEDEFAULT; y b> p>
push L CW_USEDEFAULT; x b> p>
push L WS_OVERLAPPEDWINDOW; Style b> p>
push offset szTitleName; Title string b> p>
push offset szClassName; Class name b> p>
push L 0; extra style b> p>
call CreateWindowExA b> p>
mov [newhwnd], eax b> p>
call CreatePopupMenu b> p>
mov [hsubmenu], eax b> p>
push offset item2 b> p>
push L IDM_QUIT b> p>
push 0 b> p>
push eax b> p>
call AppendMenuA b> p>
push offset item3 b> p>
push L IDM_ABOUT b> p>
push 0 b> p>
push [hsubmenu]; eax b> p>
call AppendMenuA b> p>
push offset item1 b> p>
push [hsubmenu] b> p>
push MF_POPUP b> p>
push [hMenu] b> p>
call AppendMenuA b> p>
nop b> p>
push L SW_SHOWNORMAL b> p>
push [newhwnd] b> p>
call ShowWindow b> p>
push [newhwnd] b> p>
call UpdateWindow b> p>
push [newhwnd] b> p>
call DrawMenuBar b> p>
msg_loop: b> p>
push L 0 b> p>
push L 0 b> p>
push L 0 b> p>
push offset msg b> p>
call GetMessageA b> p>
cmp ax, 0 b> p>
je end_loop b> p>
push offset msg b> p>
call TranslateMessage b> p>
push offset msg b> p>
call DispatchMessageA b> p>
jmp msg_loop b> p>
end_loop: b> p>
push [msg.msWPARAM] b> p>
call ExitProcess b> p>
;---- b> Віконна b> b> процедура b> ---- b>
WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD, b> p>
wparam: DWORD, lparam: DWORD b> p>
LOCAL hDC: DWORD b> p>
cmp [wmsg], WM_DESTROY b> p>
je wmdestroy b> p>
cmp [wmsg], WM_SIZE b> p>
je wmsize b> p>
cmp [wmsg], WM_CREATE b> p>
je wmcreate b> p>
cmp [wmsg], WM_PAINT b> p>
je wmpaint b> p>
;************************************** b>
cmp [wmsg], WM_COMMAND b> p>
je wmcommand b> p>
;************************************** b>
jmp defwndproc b> p>
wmcommand: b> p>
mov eax, lparam b> p>
cmp ax, 0 b> p>
jne m1 b> p>
mov eax, wparam b> p>
cmp ax, IDM_ABOUT b> p>
jne m2 b> p>
call MessageBoxA, 0, offset szHello, offset szAppName, MB_OK b> p>
jmp m1 b> p>
m2: cmp ax, IDM_QUIT b> p>
jne m1 b> p>
push 0 b> p>
call PostQuitMessage b> p>
m1: mov eax, 0 b> p>
jmp finish b> p>
wmcreate: b> p>
mov eax, 0 b> p>
jmp finish b> p>
defwndproc: b> p>
push [lparam] b> p>
push [wparam] b> p>
push [wmsg] b> p>
push [hwnd] b> p>
call DefWindowProcA b> p>
jmp finish b> p>
wmdestroy: b> p>
push L 0 b> p>
call PostQuitMessage b> p>
mov eax, 0 b> p>
jmp finish b> p>
wmsize: b> p>
mov eax, 0 b> p>
jmp finish b> p>
wmpaint: b> p>
push offset lppaint b> p>
push [hwnd] b> p>
call BeginPaint b> p>
mov [hDC], eax b> p>
push offset lppaint b> p>
push [hwnd] b> p>
call EndPaint b> p>
mov eax, 0 b> p>
jmp finish b> p>
finish: b> p>
ret b> p>
WndProc endp b> p>
;--------------------------------- b> p>
public WndProc b> p>
end start; b> кінець програми p>
p>
Рис1. Вікно програми p>
Висновок p>
Моя задача полягала в створенні програми b> без файлу опису ресурсів за допомогою функцій CreateMenu і CreatePopupMenu.
Ця програма не виконує ніякої корисної роботи і служить для демонстрації деяких можливостей системи в організації інтерфейсу користувача. P>
Бібліографічний список p>
Зубков С.В. Assembler. Для DOS Windows і Unix. М.: ДМК, 1999 p>
Пустоваров В.І. Асемблер. Програмування та аналіз коректності машинних програм. P>
Застосування TURBO ASSEMBLER для програмування ПЕОМ. Частина 1, 2.: Методичні вказівки до лабораторного
практикуму з дисципліни: "Системне програмне забезпечення»/Укладач В. П. Кулюкін. Екатеринбург: изд. ІПК УГТУ, 2000. P>