Особливості програмування з використанням функцій Win32 API

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2018
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Системне програмування

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ЗВІТ З лабораторної роботи №5 з дисципліни “Системне програмування” на тему: “ Особливості програмування з використанням функцій Win32 API” Мета: ознайомитись з можливостями та набути навиків програмування на Асемблері в OS Windows та засвоїти навики використання функцій API Win32. ЗАВДАННЯ Реалізувати програму, що викликає Win32 API функцію згідно варіанту і виводить результат її роботи на екран. № варіанту Функція API  27 GetSystemTime   ХІД ВИКОНАННЯ Згідно варіанту змінюю код програми наведеної в методичних вказівках на власний. Лістинг програми .586 ; для процесора не нижче INTEL-586 .model flat, STDCALL ; компілювати як програму для WIN32 option casemap :none ; код чутливий до регістру літер ; Визначення зовнішніх процедур: include \masm32\include\windows.inc ; завжди першим include \masm32\macros\macros.asm ; підтримка макросів MASM ; -------------------------------------------------------------- ; підключення файлів з форматами прототипів виклику функцій include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc ; -------------------------------------------------------------- ; підключення заголовків бібліотек експортованих функцій includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .DATA TIME SYSTEMTIME<> TIMEFORMAT db "HH:mm:ss",0 ;my_title db ' Лабораторна робота № 5 ', 0 ;my_message db 'Time is: ' ; szBuffer db 100 dup (0) .CODE start: invoke GetSystemTime,offset TIME invoke GetTimeFormat,LOCALE_USER_DEFAULT,NULL,offset TIME, offset TIMEFORMAT, offset szBuffer, sizeof szBuffer invoke MessageBox,0,offset szBuffer,0,MB_OK invoke ExitProcess,0 END start Результат виконання нової програми / Рисунок 1. Результат виконання нової програми Висновок: на даній лабораторній роботі я ознайомився з можливостями та набув навиків програмування на Асемблері в OS Windows та засвоїв навики використання функцій API Win32. 4.2.1 ; Program "Hello world" ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; ПРОЦ, МОДЕЛЬ, ОПЦІЇ, ІНКЛУДИ, БІБЛІОТЕКИ ІМПОРТУ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .386 .model flat, stdcall option casemap:none ;includelib libcmt.lib; for new vs(from vs2015) ;includelib libvcruntime.lib; for new vs(from vs2015) ;includelib libucrt.lib; for new vs(from vs2015) ;includelib legacy_stdio_definitions.lib; for new vs(from vs2015) includelib msvcrt.lib; for old vs(to vs2013) ;includelib masm32\lib\msvcrt.lib; for masm32p ;includelib \masm32\lib\msvcrt.lib; for masm32 includelib kernel32.lib; for vs ;includelib masm32\lib\kernel32.lib; for masm32p ;includelib \masm32\lib\kernel32.lib; for masm32 SetConsoleTitleA PROTO :DWORD GetStdHandle PROTO :DWORD WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD Sleep PROTO :DWORD sprintf PROTO near C :DWORD,:VARARG strlen PROTO near C :DWORD .data sWriteText db 'HELLO, WORLD!!!!', 128 dup(0) fmt db "result = %.3lf", 13, 10, 0; temp qword ? ;// X= A2*B1+C1/ (K-E1*F1) vA dq 10.; +8 vB dd 20.; +16 vC dd 30.; +20 vE dd 40.; +24 vF dd 50.; +28 a dq 10., 20., 30.; x dq ?, ?, ?; K equ 1; (153136d) ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦІЯ КОНСТАНТ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .const sConsoleTitle db 'My First Console Application',0 ;sWriteText db 'HELLO, WORLD!!!!', 128 dup(0) ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦІЯ КОДУ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .code ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; Головна Процедура ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= main PROC C LOCAL hStdout :DWORD ;(1) ;-----compute------ push dword ptr vF push dword ptr vF push vE push vC push dword ptr vB push dword ptr vB push dword ptr vA + 4 push dword ptr vA call calcLab3 ;------------------ ;назва консолі push offset sConsoleTitle ;(2) call SetConsoleTitleA ;отримуємо хендл виводу ;(3) push -11 call GetStdHandle mov hStdout,EAX push offset sWriteText call strlen; eax = strlen(sWriteText) add esp, 4 ;виводимо HELLO, WORLD! ;(4) push 0 push 0 push eax; 16d ; push offset sWriteText push hStdout call WriteConsoleA ;затримка щоб побачити результат;(5) push 2000d call Sleep ;выход ;(6) push 0 call ExitProcess main ENDP calcLab3 PROC finit push ebp mov ebp, esp fld dword ptr [ebp + 20] ;C fld dword ptr [ebp + 24] ;E fld dword ptr [ebp + 28] ;F fmul ;E*F mov dword ptr temp, K fild temp fsubr ;K-E*F fdiv ;C/(K-E*F) fld qword ptr [ebp + 8] ;A fld dword ptr [ebp + 16] ;B fmul ;A*B fadd ;A*B+C/(K-E*F) fst temp push dword ptr temp[4] push dword ptr temp[0] push OFFSET fmt push OFFSET sWriteText call sprintf add esp, 16 pop ebp ret 32 calcLab3 ENDP end main / 4.2.2 #define _CRT_SECURE_NO_WARNINGS #define WIN32_LEAN_AND_MEAN // компоненти з заголовків Windows, що рідко застосовуються #define MAX_SIZE_WRITE_TEXT 1024 #include <windows.h> #include "stdio.h" #include <math.h> TCHAR sConsoleTitle[] = L"My First Console Application"; char sWriteText[MAX_SIZE_WRITE_TEXT] = { 0 }; // "HELLO, WORLD!!!!" char fmt[] = "result = %.3lf\r\n"; //X= A2*B1+C1/ (K-E1*F1) #define K 1 //(153136) extern "C" void calcLab3(double a2, float b1, float c1, float e1, float f1){ sprintf(sWriteText, fmt, a2*(double)b1+((double)c1/((double)K - ((double)e1*(double)f1)))); } int main(){ HANDLE std_out; // (1) // -----compute------ double a2 = 10.; float b1 = 20.; float c1 = 30.; float e1 = 40.; float f1 = 50.; calcLab3(a2, b1, c1, e1, f1); // ------------------ SetConsoleTitle(sConsoleTitle); // (2) std_out = GetStdHandle(STD_OUTPUT_HANDLE); // (3) WriteConsoleA(std_out, sWriteText, strlen(sWriteText), NULL, NULL);// (4) Sleep(2000);// (5) ExitProcess(0);// (6) return 0; } / 4.3.1 ; window.asm ; Графічна win32-програма, виводить вікно і міняє заголовок при натисканні лівої клавіші ; мишки. .386 .model flat EXTRN _sprintf:near include def32.inc include kernel32.inc include user32.inc ;includelib libcmt.lib; for new vs(from vs2015) ;includelib libvcruntime.lib; for new vs(from vs2015) ;includelib libucrt.lib; for new vs(from vs2015) ;includelib legacy_stdio_definitions.lib; for new vs(from vs2015) includelib msvcrt.lib; for old vs(to vs2013) ;includelib masm32\lib\msvcrt.lib; for masm32p ;includelib \masm32\lib\msvcrt.lib; for masm32 ;includelib masm32\lib\user32.lib; for masm32p ;includelib masm32\lib\kernel32.lib; for masm32p ;includelib masm32\lib\shell32.lib; for masm32p ;includelib \masm32\lib\user32.lib; for masm32 ;includelib \masm32\lib\kernel32.lib; for masm32 ;includelib \masm32\lib\shell32.lib; for masm32 .data class_name db "Window class 1",0 window_name db "Win32 assembly example",0 wnd_text db "Hello ",0 fmt db "result: x[%d] = %lf, x[%d] = %lf, x[%d] = %lf", 13, 10, 0; temp1 dd 0 temp2 dd 0 oper dd 0 temp3 qword ? CONST_41 dd 41.0; CONST_28 dd 28.0; CONST_4 dd 4.0; CONST_2 dd 2.0; CONST_1 dd 1.0; CONST_53 equ 53d; ;CONST_28 equ 28d; CONST_5 equ 5d; temp qword ? CONST_53 equ 53d; CONST_5 equ 5d; cV dd 1.; c dV dd 1.; a dq 10., 20., 30.; x dq ?, ?, ?; ; Структура, що описує клас вікна. wc WNDCLASSEX <4*12,CS_HREDRAW or CS_VREDRAW,Offset win_proc,0,0,?,?,?,\ COLOR_WINDOW+1,0,offset class_name,0> ; Тут знаходяться наступні поля: ; wc.cbSize = 4*12 - розмір цієї структури ; wc.style - стиль вікна (як перемальовувати його то) ; wc.lpfnWndProc – обробник подій вікна (віконна процедура win_proc) ; wc.cbClsExtra - число додаткових байт після структури (0) ; wc.cbWndExtra - число додаткових байт після вікна (0) ; we.hInstance - ідентифікатор нашого процеса (?) ; wc.hIcon - ідентифікатор іконки (?) ; wc.hCursor - ідентифікатор курсора (?) ; wc.hbrBackground - ідентифікатор пензлика або колір фона + 1(COLOR_WINDOW+1) ; wc.lpszMenuName - ресурс з основним меню (в цьому прикладі - 0) ; wc.lpszClassName - імя класса (рядок class.name) ; wc.hIconSm - ідентифікатор маленької іконки (тільки в Windows 95, ; для NT має бути 0). .data? msg_ MSG <?,?,?,?,?,?> ; А це - структура, в яку повертається ; повідомлення після GetMessage .code WinMain@16 proc c ;-----compute------ push 3 push dV push cV push OFFSET a push OFFSET x call calcLab4 ; push 3 push OFFSET x call printResult ;------------------ xor ebx,ebx ; В ЕВХ буде 0 для команд push 0. ; Визначити ідентифікатор нашої програми push ebx call GetModuleHandle mov esi,eax ; і зберегти його в ESI. ; Заповнити й зареєструвати клас. mov dword ptr wc.hInstance,eax ; Ідентифікатор предка. ; Вибрати іконку. push IDI_APPLICATION ; Стандартна іконка додатка. push ebx ; Ідентифікатор модуля з іконкою, call LoadIcon mov wc.hIcon,eax ; Ідентифікатор іконки для нашого класу. ; Вибрати форму курсора push IDC_ARROW ; Стандартна стрілка. push ebx ; Ідентифікатор модуля з курсором call LoadCursor mov wc.hCursor,eax ; Ідентифікатор курсору для нашого класу push offset wc call RegisterClassEx ; Зареєструвати клас. ; Створити вікно mov ecx,CW_USEDEFAULT ; push ecx коротше push N у п'ять разів. push ebx ; Адреса структури CREATESTRUCT (тут NULL) push esi ; Ідентифікатор процесу, що буде одержувати ; повідомлення від вікна (тобто наш). push ebx ; Ідентифікатор меню або вікна-нащадка. push ebx ; Ідентифікатор вікна-предка, push ecx ; Висота (CW_USEOEFAULT - за замовчуванням) push ecx ; Ширина (за замовчуванням), push ecx ; Y-координата (за замовчуванням) push ecx ; Х-координата (за замовчуванням), push WS_OVERLAPPEDWINDOW ; Стиль вікна, push offset window_name ; Заголовок вікна, push offset class_name ; Любою зареєстрований клас, push ebx ; Додатковий стиль call CreateWindowEx ; Створити вікно (еах - ідентифікатор вікна) push eax ; Ідентифікатор для UpdateWіndow. push SW_SHOWNORMAL ; Тип показу для для ShowWіndow push eax ; Ідентифікатор для ShowWіndow. ; Більше ідентифікатор вікна нам не буде потрібний call ShowWindow ; Показати вікно call UpdateWindow ; і послати йому повідомлення WM_PAІNT. ; Основний цикл - перевірка повідомлень від вікна й вихід no WM_QUІT. mov edi, offset msg_ ; push edі коротше push N в 5 разів. message_loop: push ebx ; Останнє повідомлення. push ebx ; Перше повідомлення push ebx ; Ідентифікатор вікна (0 - будь-яке наше вікно) push edi ; Адреса структури MSG call GetMessage ; Одержати повідомлення від вікна з очікуванням - ; не забувайте використати PeekMessage. ; якщо потрібно в цьому циклі щось виконувати. test eax,eax ; Якщо отримано WM_QUІT. jz exit_msg_loop ; вийти. push edi ; Інакше - перетворити повідомлення типу call TranslateMessage ; WM_KEYUP у повідомлення типу WM_CHAR push edi call DispatchMessage ; і послати їх процедурі вікна (інакше його просто ; не можна буде закрити) jmp short message_loop ; Продовжити цикл exit_msg_loop: ;Вихід із програми. push ebx call ExitProcess WinMain@16 endp ; Процедура wіn_proc ; Викликається вікном щораз, коли воно одержує яке-небудь повідомлення. ; Саме тут буде відбуватися вся робота програми. ; Процедура не повинна змінювати регістри EBP, EDІ, ESІ й ЕВХ! win_proc proc ; Тому що ми одержуємо параметри в стеці, побудувати стековый кадр. push ebp mov ebp,esp ; Процедура типу WіndowProc викликається з наступними параметрами: wp_hWnd equ dword ptr [ebp+08h] ; ідентифікатор вікна, wp_uMsg equ dword ptr [ebp+0Ch] ; номер повідомлення, wp_wParam equ dword ptr [ebp+10h] ; перший параметр, wp_lParam equ dword ptr [ebp+l4h] ; другий параметр. ; Якщо ми одержали повідомлення WM_DESTROY (воно означає, що вікно вже видалили ; з екрана, нажавши ALT+F4 або кнопку у верхньому правому куті), ; то відправимо основній програмі повідомлення WM_QUІT. cmp wp_uMsg,WM_DESTROY jne not_wm_destroy push 0 ; Код виходу. call PostQuitMessage ; Послати WM_QUІT jmp short end_wm_check ; і вийти із процедури. not_wm_destroy: cmp wp_uMsg,WM_LBUTTONDOWN je wm_lbutdwn ; Якщо ми одержали інше повідомлення - викликати його оброблювач за замовчуванням. leave ; Відновити ebp jmp DefWindowProc ; і викликати DefWіndowProc з нашими параметрами ; і адресою повернення в стеці. wm_lbutdwn: ; Вивести текст у заголовку вікна push offset wnd_text push wp_hWnd call SetWindowText leave jmp DefWindowProc ; Після внесення своїх зміни в стандартний хід опрацювання ; повідомлення треба дати програмі завершити опрацювання ; стандартним чином end_wm_check: leave ; Відновити ebp ret 16 ; і повернутися самим, очистивши стек від параметрів. win_proc endp calcLab4 PROC finit push ebp mov ebp, esp mov ecx, dword ptr [ebp + 24] xor esi, esi; (mov esi, 0) fld dword ptr [ebp + 16] ; c fld dword ptr [ebp + 20] ; d fcompp ;xor eax, eax fstsw ax sahf jnb compute_loop_2; // if (c <= d) goto compute_loop_2; mov ebx, dword ptr [ebp + 12] ; a fld qword ptr [ebx + 8 * esi]; a[esi] fld dword ptr [ebp + 20] ; d fdiv dword ptr [ebp + 16] fadd fst temp compute_loop_1: ; // if (c > d); mov ebx, dword ptr [ebp + 12] ; a fld qword ptr [ebx + 8 * esi]; a[esi] fld dword ptr [ebp + 16] ; c fdiv CONST_4 fsub fld CONST_1 fadd fst temp2 finit fld temp fld temp2 fdiv; mov ebx, dword ptr [ebp + 8] ; x fst qword ptr [ebx + 8 * esi] ; x[esi] inc esi loop compute_loop_1 jmp output ;_____________________________________________________________ compute_loop_2: ; // if (c <= d); fld CONST_41 fmul dword ptr [ebp + 20]; d mov ebx, dword ptr [ebp + 12] ; a fld qword ptr [ebx + 8 * esi]; a[esi] fdiv fsqrt fld CONST_1 fadd fst temp mov ebx, dword ptr [ebp + 12] ; a fld qword ptr [ebx + 8 * esi]; a[esi] fld dword ptr [ebp + 16] ; c fdiv dword ptr [ebp + 20] fsub fst temp3 finit fld temp fld temp3 fdiv; mov ebx, dword ptr [ebp + 8] ; x fst qword ptr [ebx + 8 * esi] ; x[esi] inc esi loop compute_loop_2 jmp output output: pop ebp ret 20 ;_____________________________________________________________ calcLab4 ENDP mov ebx, dword ptr [ebp + 12] ; a fld qword ptr [ebx + 8 * esi]; a[esi] printResult PROC push ebp mov ebp, esp mov ecx, dword ptr [ebp + 12] ; mov ecx, dword ptr [ebp + 24]; (for motod 2) mov esi, ecx dec esi mov ebx, dword ptr [ebp + 8] ; x output_loop: ;mov edx, dword ptr [ebx + 8 * esi + 4]; ;mov eax, dword ptr [ebx + 8 * esi]; ;push edx; ;push eax; push dword ptr [ebx + 8 * esi + 4]; push dword ptr [ebx + 8 * esi]; push esi dec esi loop output_loop push OFFSET fmt push OFFSET wnd_text call _sprintf add esp, 8 mov eax, dword ptr [ebp + 12] ; mov ecx, dword ptr [ebp + 24]; (for motod 2) mov ecx, 12 mul ecx add esp, eax ; 8(4+4) + n*8(4+4) pop ebp; ret 8 ; ret 20; (for motod 2) printResult ENDP ;end; for new vs(from vs2015) end WinMain@16; for old vs(to vs2013) and masm32/masm32p / 4.3.2 #define _CRT_SECURE_NO_WARNINGS #define _CRT_NON_CONFORMING_SWPRINTFS #define WIN32_LEAN_AND_MEAN // компоненти з заголовків Windows, що рідко застосовуються #define MAX_SIZE_WND_TEXT 1024 #include <windows.h> #include "stdio.h" #include <math.h> #include <cmath> wchar_t class_name[] = L"Window class 1"; wchar_t window_name[] = L"Win32 assembly example"; wchar_t wnd_text[MAX_SIZE_WND_TEXT] = { 0 }; // L"Hello"; #define MAX_ARRAY_SIZE 256 #define ARRAY_SIZE = 3 #define ARRAY_VALUES = {10., 20., 30.} #define C_VALUE = 1. #define D_VALUE = 1. LRESULT CALLBACK win_proc(HWND wp_hWnd, UINT wp_uMsg, WPARAM wp_wParam, LPARAM wp_lParam); void calcPract4ByLab4(double * x, double * a, float c, float d, int n){ for (int index = 0; index < n; ++index){ if (c > d) { x[index] =(a[index]+(d/c))/(a[index]-(c/4)+1) ; // (c > d) } else{ x[index] = (sqrt((41*d)/a[index])+1)/(a[index] - (c/d)) ;// (c <= d) } } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) { int n ARRAY_SIZE; double a[MAX_ARRAY_SIZE] ARRAY_VALUES, x[MAX_ARRAY_SIZE];// ARRAY_VALUES; float c C_VALUE; float d D_VALUE; calcPract4ByLab4(x, a, c, d, n); swprintf(wnd_text, L"Result = [%lf][%lf][%lf]", x[0], x[1], x[2]); MSG msg_; HWND hWnd; WNDCLASSEX wc; wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = win_proc; wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = class_name; wc.hIconSm = NULL; wc.hInstance = GetModuleHandle(NULL); /*handle to the file used to create the calling process */ wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClassEx(&wc); hWnd = CreateWindowEx( NULL, class_name, window_name, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, wc.hInstance, NULL); ShowWindow(hWnd, SW_SHOWNORMAL); UpdateWindow(hWnd); while (GetMessage(&msg_, NULL, NULL, NULL)) { TranslateMessage(&msg_); DispatchMessage(&msg_); } return msg_.wParam; } //Віконна процедура LRESULT CALLBACK win_proc(HWND wp_hWnd, UINT wp_uMsg, WPARAM wp_wParam, LPARAM wp_lParam) { switch (wp_uMsg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN: SetWindowText(wp_hWnd, wnd_text); break; default: return DefWindowProc(wp_hWnd, wp_uMsg, wp_wParam, wp_lParam); } return 0; }
Антиботан аватар за замовчуванням

04.12.2018 22:12-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!