Зміст
Вступ………………………………………………………………….......………..4
Формулювання задачі…………………………………..…………….……………5
Алгоритм розв’язання задачі………………………………………………………6
Програмні реалізації алгоритму………………….…………………………….…8
Інструкція користувачеві програми…………………….………………………..11
Контрольні прилади та аналіз їх реалізації……………..……………………….13
Висновки…………………………………………….…………………………….14
Література……………………………………………………………………….…15
ВСТУП
Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.
В цій курсовій роботі я спробував створити програму яка з могла б зацікавити користувача в роботі з комп’ютером, та допомогти йому в справах які важко запам’ятати…
На даний час більшість людей мають діже багато справ, заклопотані в повсякденному житті, тому я розробив таку програму коли відкривши свій комп’ютер людині було б цікавіше коли в неї на робочому столі змінюються шпалери, а також нагадує про справу яку вона має зробити, чи завершити.
Формулювання задачі
Дана програма повинна автоматично змінювати шпалери відносно часу, а також повідомляти про свята, дні народження родини та друзів, чи будь яких справ які ви собі запланували. Для реалізації цієї програми я використовую усі можливі оператори мови асемблер.
Метою розв’язання цієї задачі є зміна шпалер та нагадування. В результаті програмної реалізації користувач повинен отримати змінені шпалери та повідомлення про якусь справу, свято і т.п.
Алгоритм програми
Дана програма складається з двох частин в першій частині вона нагадуватиме про будь яку справу людині, а друга частина змінюватиме шпалери на робочому столі.
Щоб наша програма працювала навіть тоді коли ми включили, а потім знову включили комп’ютер спершу ми заносимо ярлик exe файлу в авто загрузку за допомогою цієї функції:
invoke CopyFile,addr file,addr newfile,1.
В першій частині програми ми робимо такі дії:
Дізнаємось теперішній час:
Щоб дізнатись теперішній час використовуємо функцію:
invoke GetSystemTime,addr time
Відкриваємо та зчитуємо файл в якому записані всі справи;
Файл знаходиться там де встановлена программа, зчитуємо його за допомогою функції:
invoke ReadFile,hFile,pMemory,MEMSIZE-1,addr SizeRead,0
Порівнюємо теперішню дату з тими датами яка є у файлі:
invoke lstrcmp,addr new1,addr new2;
Виводимо на екран справу яку ми повинні зробити сьогодні:
invoke MessageBox,0,addr new4,addr title1,MB_OK;
Закриваємо файл:
invoke CloseHandle,hFile.
В другій частині ми робимо такі дії:
Дізнаємось теперішню дату та час:
invoke GetSystemTime,addr time;
Дивимось на дату та час і міняємо картинку робочого стола на ту яка повинна бути;
Зациклюємо програму так щоб вона робила перевірку кожних 10 секунд:
invoke Sleep,10000.
Програмні реалізції алгоритму
Практичною метою нашої курсової роботи було написання мовою асемблер програми, яка б змінювала шпалери на робочому столі та нагадувала про будь-яку дату.
Функція CopyFile:
Копіює файл
BOOL CopyFile(
LPCTSTR lpExistingFileName, //вказівник на стрічку, що містить шлях + ім'я файлу, що копіюється;
LPCTSTR lpNewFileName, //вказівник на стрічку, що містить шлях + файлу-копії (нове ім’я);
BOOL bFailIfExists //якщо значення - ненульове, то в разі існування файлу-копії, функція не виконується; якщо значення - нульове - файл перезаписується. );
Результат:
В позитивному випадку результат ненульовий
Функція GetSystemTime:
заповнює структуру SYSTEMTIME значенням поточного часу за Грінвичем
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // адреса структури системного часу (SYSTEMTIME), яка буде заповнена. );
Результат:
Функція нічого не повертає
Функція ReadFile: читає файл
BOOL ReadFile(
HANDLE hFile // хендл файлу;
LPVOID lpBuffer // блоку пам’яті в який попадуть дані;
DWORD nNumberOfBytesToRead // кількість байтів, що треба зчитати;
LPDWORD lpNumberOfBytesRead // адреса змінної де буде записано значення кількості зчитаних байтів;
LPOVERLAPPED lpOverlapped // адреса структури спільного використання або NULL );
Результат:
В позитивному випадку результат не нульовий
Функція Lstrcmp: Порівнює дві стрічки з врахуванням регістру
int lstrcmp(
LPCTSTR lpString1, // адреса першої стрічки
LPCTSTR lpString2 // адреса другої стрічки );
Результат:
В позитивному випадку :
String1 < String2 - відємне значення
String1 > String2 - додатнє значення
String1 = String2 - нуль
Функція MessageBox: Створює і відображає блок діалогу, що містить вказане повідомлення і заголовок, а також зумовлені піктограми і текстові кнопки, відповідно до параметра uType.
int MessageBox(
HWND hWnd, // Вікно, що володіє блоком повідомлень, або NULL.
LPCTSTR lpText, // Адреса рядка повідомлення, що відображається, або NULL
LPCTSTR lpCaption, // Адреса рядка заголовоку блоку діалогу (або NULL - текст заголовока буде мати значення "Error").
UINT uType // Стиль вікна, Одна або комбінація констант MB_. );
Результат:
IDABORT // Була вибрана кнопка перервати
IDCANCEL // Була вибрана кнопка відмінити
IDIGNORE // Була вибрана кнопка знехтувати
IDNO // Була вибрана кнопка ні
IDOK // Була вибрана кнопка OK
IDRETRY // Була вибрана кнопка повторення
IDYES // Була вибрана кнопка Так
При натиснені клавіші ESC на клавиатурі MessageBox повертає значення IDCANCEL.
Повертає NULL, якщо недостатньо пам'яті для відображення повідомлення
Функція CloseHandle: Закриває відкритий об'єкт, хендл якого вказаний як параметр
BOOL CloseHandle(
HANDLE hObject //хендл об’єкту, який треба закрити. );
Результат:
В позитивному випадку результат ненульовий
Інструкція користувачеві
У даній програмі користувач по суті нічого робити не повинен. Програма все робить замість нього, йому потрібно буде лише встановити дану програму на комп’ютер, а потім насолоджуватись роботою програми.
Щоб встановити програму на комп’ютер користувачеві потрібно зробити такі дії:
Перемістити папку під назвою “change and reminders” з диска на свій комп’ютер в будь-який корінь;
Відкрити папку та записати справи які ви хочите щоб програма вам нагадувала
Запусти ти exe файл який називається kurs і знаходиться в папці яку ви переміщали.
Щоб записати справи які ви хочите щоб програма вам нагадувала потрібно зробити такі дії:
Відкрити файл під назвою 1.txt за допомогою блокнота;
Записати справи таким чином як показано на рис. 1;
Рис. 1
Зберегти записане та закрити файл.
Контрольні прилади та аналіз їх реалізації
Для відлагодження та перевірки працездатності програми я використовував такі тести рисунки зображені далі:
Рис. 2. Весна, обід.
Щоб перевірити чи працює програма змінив дату та час:
Рис. 3. Осінь, ранок.
Щоб перевірити чи працює нагадування змінив дату:
Рис. 3. Показує нагадування.
За результатами тестів які я проводив можна сказати, що програма працює якісно і швидко та без жодної помилки.
Висновки
Отже на мою думку мені вдалось створити програму яка зможе допомагати людям та покращити настрій при роботі з комп’ютером. Поставлена задача була створити програму яка б змінювала шпалери та нагадувала справи які написав користувач, і я зміг виконати цю задачу.
З усіх перевірок та тестів програма бездоганно працює на всіх комп’ютері. Не залежно від віку будь-який користувач зможе встановити цю програму за допомогою моїх підказок які я навів вище. Під час роботи над цією курсовою я дізнався більше про асемблер і думаю дальше розвивати свої ідеї в цьому напрямку.
Список літератури
Питер Абель, Ассемблер и программирование
В. Юров. Справочная система по языку ассемблера
Інтернет - http://ru.wikipedia.org/wiki/Ассемблер
Інтернет - http://www.is.svitonline.com/vcg/materials_ukr.html
Інтернет - http://213.59.170.24/1/Programming/Assembler/Index.html
Додатки
Текст програми
include WINDOWS.inc
include user32.inc
include kernel32.inc
include shell32.inc
includelib shell32.lib
includelib user32.lib
includelib kernel32.lib
.data
kil dd 0
hour dw 0
lito db 'Літо',0
vesna db 'Весна',0
osin db 'Осінь',0
zuma db 'Зима',0
immage db 256 dup (0)
;================================================== immage
vesna1 db '1.jpeg',0
vesna2 db '2.jpg',0
vesna3 db '3.jpeg',0
lito1 db '4.jpg',0
lito2 db '5.jpeg',0
lito3 db '6.jpg',0
osin1 db '7.JPG',0
osin2 db '8.jpg',0
osin3 db '9.jpg',0
zuma1 db '10.jpg',0
zuma2 db '11.jpg',0
zuma3 db '12.jpg',0
;=================================================== startup
DIRECTORY_ID dd 0
DIRECTORY_NAME db 512 dup(0)
file db 'kurs.lnk',0
newname db '\Made by Demianovskyi.lnk',0
newfile db 256 dup (0)
;================================================== нагадування
title1 db 'Нагадування Made by Demianovskyi',0
openname db '1.txt',250 dup(0)
hFile dd 0
hMemory dd 0 ; Хендл блоку пам'яті
pMemory dd 0 ; Адреса блоку пам'яті
SizeRead dd 0
MEMSIZE equ 1000000h ; 16 Mb
format db '%ld',0
bufer db '.',0
bufer1 db 1000 dup (0)
new db 2000 dup (0)
radok db 256 dup (0)
new1 db 256 dup (0)
new2 db 256 dup (0)
new3 db 256 dup (0)
point db '.',0
new4 db 1000 dup (0)
new5 db 0dh,0ah
new10 db 1000 dup (0)
.386
.model flat,STDCALL
option casemap :none ;case sensitive
include kurs.inc
.code
Begin:
call main
invoke ExitProcess,NULL
main proc
LOCAL time:SYSTEMTIME
;=============================================================== startup
invoke SHGetSpecialFolderLocation,0,7,addr DIRECTORY_ID
invoke SHGetPathFromIDList,DIRECTORY_ID,addr DIRECTORY_NAME
invoke lstrcpy,addr newfile,addr DIRECTORY_NAME
invoke lstrcat,addr newfile,addr newname
invoke CopyFile,addr file,addr newfile,1
m1:
invoke GetSystemTime,addr time
mov ax,time.wHour
mov hour,ax
;================================================================== нагадування
;==================================================================================================================
inc kil
.if kil == 1
invoke wsprintf,addr new2,addr format,time.wDay
invoke wsprintf,addr new3,addr format,time.wMonth
invoke lstrcat,addr new2,addr point
invoke lstrcat,addr new2,addr new3
;================================================================== нагадування
;=========================================================================== читаєм файл
invoke CreateFile,addr openname,GENERIC_READ,FILE_SHARE_READ,0,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0
mov hFile,eax ; отримали хендл файлу
invoke GlobalAlloc,2h + 40h,MEMSIZE
mov hMemory,eax ; отримали хендл блоку пам'яті
invoke GlobalLock,hMemory ; розмістили блок
mov pMemory,eax ; та отримали його адресу
invoke ReadFile,hFile,pMemory,MEMSIZE-1,addr SizeRead,0
;==========================================================
invoke lstrcpy,addr new,pMemory
lea esi,new
m2: lea edi,bufer1
m3:
.if byte ptr [esi] == 13
jmp exit
.endif
.if byte ptr [esi] == 0
jmp exit1
.endif
mov al,byte ptr [esi]
mov byte ptr [edi],al
inc esi
inc edi
jmp m3
exit: inc esi
mov byte ptr [edi],0
;========================================================= в буфер1 рядок
invoke lstrcpy,addr radok,addr bufer1
lea edx,bufer1
lea ecx,new1
m10:
.if byte ptr [edx] == " "
jmp ex2
.endif
mov al,byte ptr [edx]
mov byte ptr [ecx],al
inc edx
inc ecx
jmp m10
ex2:
inc edx
mov byte ptr [ecx],0
;======================================================== new1- data radok-all line
invoke lstrcmp,addr new1,addr new2
.if eax == 0
invoke lstrcat,addr new4,addr radok
invoke lstrcat,addr new4,addr new5
.endif
inc esi
jmp m2
exit1:
.if new4 == 0
jmp exit2
.else
invoke MessageBox,0,addr new4,addr title1,MB_OK
.endif
exit2:
mov new4,0
invoke CloseHandle,hFile ; закрити файл
invoke GlobalUnlock,hMemory ; розблокувати блок пам'яті
invoke GlobalFree,hMemory ; звільнити блок пам'яті
.endif
;===========================================================================================
;============================================================================================
;================================================================ vesna
.if time.wMonth > 2 && time.wMonth < 6
.if hour > 2 && hour < 10
invoke lstrcpy,addr immage,addr vesna1
.elseif hour > 9 && hour < 16
invoke lstrcpy,addr immage,addr vesna2
.else
invoke lstrcpy,addr immage,addr vesna3
.endif
;================================================================= lito
.elseif time.wMonth > 5 && time.wMonth < 9
.if hour > 2 && hour < 10
invoke lstrcpy,addr immage,addr lito1
.elseif hour > 9 && hour < 16
invoke lstrcpy,addr immage,addr lito2
.else
invoke lstrcpy,addr immage,addr lito3
.endif
;================================================================= osin
.elseif time.wMonth > 8 && time.wMonth < 12
.if hour > 2 && hour < 10
invoke lstrcpy,addr immage,addr osin1
.elseif hour > 9 && hour < 16
invoke lstrcpy,addr immage,addr osin2
.else
invoke lstrcpy,addr immage,addr osin3
.endif
;================================================================= zuma
.else
.if hour > 2 && hour < 10
invoke lstrcpy,addr immage,addr zuma1
.elseif hour > 9 && hour < 16
invoke lstrcpy,addr immage,addr zuma2
.else
invoke lstrcpy,addr immage,addr zuma3
.endif
.endif
;================================================================== set immage
invoke SystemParametersInfo,SPI_SETDESKWALLPAPER,0,addr immage,SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE
mov immage,0
;================================================================= sleep
invoke Sleep,10000
jmp m1
ret
main endp
end Begin