DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

Особливості програмування з використанням функцій 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:30

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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