КУРСОВИЙ ПРОЕКТ
з дисципліни “Системне програмування”
Тема – РОЗРОБКА РЕЗИДЕНТНОЇ ПРОГРАМИ, ЯКА ПОКАЗУЄ ПОТОЧНУ ДАТУ І ЧАС, А ТАКОЖ ГЕНЕРУЄ ЗВУКОВИЙ СИГНАЛ ЧЕРЕЗ ЗАДАНИЙ ЧАСОВИЙ ІНТЕРВАЛ
Анотація
В курсовому проекті розроблено алгоритм обробки переривань таймера, на основі якого написано резидентну програму, яка генерує звуковий сигнал через заданий часовий інтервал. Програму виконано на рівні BIOS-переривань та команд мови Assembler, також детально розглянута структура та параметри резидентної області.
Summary
In a course project the algorithm of the events trapping of timer is developed on the basis of which resident software is written which generates a sound signal through the set sentinel interval. The program is executed at the level of BIOS-breaking and commands of language of Assembler, also in detail considered structure and parameters of resident region.
Зміст
ЗМІСТ 5
ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ
В ПРОГРАМІ, БЛОК-СХЕМА ПРОГРАМИ 6
КОД ПРОГРАМИ З ПОЯСНЕННЯМИ (РЕМАРКАМИ)…… 11
ОПИС РОБОТИ 18
ВИСНОВКИ 19
ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ 20
2. ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ, БЛОК-СХЕМА ПРОГРАМИ
В резидентній програмі, яка виводить поточну дату і час, а також генерує звуковий сигнал через заданий інтервал часу використано наступні функції:
jmp - команда безумовного переходу, передає управління в іншу точку програми, не зберігаючи будь-якої інформації для повернення. Операндом може бути безпосередня адреса для переходу, а також регістр або змінна, що містить адресу. В даній програмі ця функція виконує перехід до загрузчика.
jl - команда, яка здійснює перехід, аналогічний попередній, з умовою якщо перший операнд при попередньому порівнянні виявився меншим від другого.
jne - ця команда здійснює перехід, за умови що операнди виявились не рівними між собою.
ja - ця команда здійснює перехід, за умови що один з операндів виявився вище другого.
jc - ця команда здійснює перехід, за умови переносу.
jz - ця команда здійснює перехід, за умови рівності нулю.
jbe - ця команда здійснює перехід, за умови що операнди або нижчі один одного або рівні між собою.
pusha - команда розміщує в стеку регістри в порядку : AX,CX,DX,BX,SP,BP,SI,DI.
pushf - команда розміщує регістр флажків в стеці.
popa - команда виконує дії повністю протилежні pusha, але поміщене в стек значення SP або ESP ігнорується. popa завантажує зі стеку DI,SI,BP, збільшує SP на 2, і завантажує BX,DX,CX,AX.
mov - базова команда пересилання даних. Здійснює копіювання даних з джерела (вказується другим) в приймач (вказується першим, одразу після назви команди).
cmp - команда зрівнює операнди і встановлює флажки. Процес здійснюється шляхом вирахування джерела (число, регістр або змінна) з приймача (регістр або змінна, приймач та джерело не можуть бути змінними одночасно), при чому результат вирахування нікуди не записується. Єдиним наслідком роботи цієї команди є зміна флажків CF, OF, SF, ZF, AF і PF. В даній програмі команда використовується в поєднанні з командами переходу jmp, jl та jne.
iret - вихід (повернення) з переривання. Повертає зі стеку значення IP, CS і FLAGS, які були до переривання.
call - ця команда здійснює виклик процедури або переключення задачі.
inc - ця команда збільшує значення операнда в пам’яті або регістрі на 1.
lea - ця команда забезпечує отримання ефективної адреси (зміщення) джерела.
xor - ця команда забезпечує виконання операції виключаючого АБО з двома операндами місткістю в байт, слово або подвійне слово.
sub - ця команда забезпечує цілочислове віднімання.
out - ця команда забезпечує вивід значення в порт вводу/виводу.
in - ця команда забезпечує ввід значення з порту вводу/виводу.
or - ця команда забезпечує виконання операції логічного АБО з
бітами операнду призначення.
loop - ця команда забезпечує організацію циклу з лічильником в регістрі сх.
ret - ця команда забезпечує повернення управління з процедури до викликаючої її програми.
shl - ця команда забезпечує логічний зсув операнду вліво.
rcl - ця команда забезпечує виконання операції циклічного зсуву операнду вліво через флажок переносу cf .
add - ця команда забезпечує додавання двух операндів джерело і приймач місткістю в байт, слово або подвійне слово.
xchg - ця команда забезпечує обмін двох значень між двома регістрами або між регістрами і пам’яттю.
mul - ця команда забезпечує виконання операції множення двох цілих чисел без врахування знаку.
Блок – схема загрузочної частини програми
так ні
Блок – схема резидентної частини програми
так ні
Програма на мові Assembler
.model tiny ; модель пам’яті
.code ; основний сегмент коду
.286 ; директива задання набору допустимих команд
.startup
begin_:
jmp install_
my_1Ch proc
pushf ; зберігаємо всі флажки в стеку
call cs:old_1Ch ; викликаємо оригiнальний вектор
push ax ; зберігаємо в стек
push cx ; регістри
mov ax,word ptr cs:delta ; наступив час
cmp ax,word ptr cs:cntr ; звукового
ja not_in_time ; сигналу
mov word ptr cs:cntr,0 ; скидаємо лiчильник
mov ax,400 ; частота i тривалiсть
mov cx,2000 ; звукового сигналу
call Sound ; викликаємо процедуру Sound
not_in_time:
inc word ptr cs:cntr ; iнкриментуєм лiчильник
pop cx
pop ax
pusha
push ds
push es
mov ax,cs
mov ds,ax
mov es,ax
lea si,td ; де будуть відображатися дата i час для подальшого
виведення на екран
wait_data:
mov ah,04h ; отримуємо
int 1Ah ; дату
jc wait_data
; переконвертовуємо i записуємо
; у рядок день, мiсяць i рiк
xor ah,ah
mov al,dl
call Reg2Str ; викликаємо процедуру Reg2Str
inc si
mov al,dh
call Reg2Str
inc si
mov ax,cx
call Reg2Str
wait_time:
mov ah,02h ; отримуємо
int 1Ah ;