МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Інститут підприємництва і перспективних технологій
при національному університеті «Львівська політехніка»
Контрольна розрахункова робота
на тему «Створення елементарної Windows-програми з віконним інтерфейсом на мові Асемблер»
Створення вікон на Асемблері
Мета: ознайомитись з створенням вікон в середовищі Асемблер
Теоретичні відомості
Windows містить дуже багато ресурсів для програм. Центральне місце в них займає Win32 API. Windows API це набір дуже корисних і готових до використання будь-якою програмою функцій, розташованих усередині Windows і функціонально об'єднаних в DLL-файлах, таких як Kernel32.dll, User32.dll і Gdi32.dll. Kernel32.dll містить API-функции, що працюють з пам'яттю і керуючі процесами. User32.dll управляє інтерфейсом Вашої програми. Gdi32.dll містить графічні функції. Окрім трьох основних існують і інші бібліотеки, інформація про них вам також доступна.
Windows-програма динамічно пов'язана з dll-файлами, тобто код API-функції не включається у виконуваний файл, на це місце поміщається команда безумовного переходу в те місце відповідної бібліотеки, де знаходиться дана функція. Для того, щоб Ваша програма змогла знайти необхідні API-функции в процесі роботи, Ви повинні включити деяку інформацію .exe файл. Необхідна інформація знаходиться в бібліотечних функцій, що імпортуються. Ви повинні пов'язати свою програму з вірною бібліотекою функцій, що імпортуються, інакше вона не зможе знайти необхідну функцію.
Існує два типи API-функций: ANSI і Unicode. Імена ANSI функцій закінчуються символом "А", наприклад стандартне вікно. Імена Unicode функцій закінчується символом "W" (Wide char), наприклад стандартне вікно. Windows 95 в основному використовує ANSI функції, Windows NT - Unicode.
Текст програми:
.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 ‘Виконав Шиш володимир’,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
Результат вікна:
Висновок: в цій роботі я ознайомився з створенням вікон в мові програмування Асемблер і застосував це для виконання даної роботи.