У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


КУРСОВИЙ ПРОЕКТ

з дисципліни “Системне програмування”

Тема – Розробка резидентної програми, що забезпечує виконання ефекту загортання при переміщенні курсору маніпулятора “миша”

Анотація

В курсовому проекті розроблено алгоритм обробки переривань таймера на основі якого написано резидентну програму яка реалізує ефект загортання при переміщенні курсору маніпулятора “миша”. Програму виконано на рівні 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 will realize a wrapping effect at moving to the cursor of manipulator “mouse”. 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.

Зміст

ЗМІСТ ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ,

БЛОК-СХЕМА ПРОГРАМИ

КОД ПРОГРАМИ З ПОЯСНЕННЯМИ (РЕМАРКАМИ) ОПИС РОБОТИ

ВИСНОВКИ

ПЕРЕЛІК ВИКОРИСТАНИХ ЛІТЕРАТУРНИХ ДЖЕРЕЛ

2 ОПИС ОСНОВНИХ ФУНКЦІЙ, ЩО ВИКОРИСТАНІ В ПРОГРАМІ, БЛОК-СХЕМА ПРОГРАМИ

В резидентній програмі яка реалізує ефект загортання при переміщенні курсору маніпулятора “миша” використано наступні функції:

jmp - команда безумовного переходу, передає управління в іншу точку програми, не зберігаючи будь-якої інформації для повернення. Операндом може бути безпосередня адреса для переходу, а також регістр або змінна, що містить адресу. В даній програмі ця функція виконує перехід до загрузчика.

jl - команда, яка здійснює перехід, аналогічний попередній, з умовою якщо перший операнд при попередньому порівнянні виявився меншим від другого.

jne - ця команда здійснює перехід, за умови що операнди виявились не рівними між собою.

pusha - команда розміщує в стеку регістри в порядку : AX,CX,DX,BX,SP,BP,SI,DI.

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 які були до переривання. 

Блок – схема резидентної частини програми

Так Ні

 

Так Ні

Блок – схема загрузочної частини програми

 

Програма на мові Assembler

.286 ; задання типу процесора

code segment

org 100h

assume cs:code, ds:code

intNumber equ 1ch ;номер переривання, що перехоплюється

start:

jmp install

DarkFunction proc

pusha ; занесення усіх основних регістрів до стеку

mov ax,0003h ; визначення положення курсору

int 33h

;---------------------------------------x-------------------------------

cmp cx,631 ; перевірка досягнення крайньої правої точки

jl m4

mov ax,0004h ; установка курсору на протилежну позицію

mov cx,1

int 33h

m4:

cmp cx,0 ; перевірка досягнення крайньої лівої точки

jne m3

mov ax,0004h ; установка курсору протилежну позицію

mov cx,630

int 33h

;----------------------------------------y------------------------------

m3:

cmp dx,199 0 ; перевірка досягнення крайньої нижньої точки

jl m5

mov ax,0004h ; установка курсору протилежну позицію

mov dx,1

int 33h

 

m5:

cmp dx,0 0 ; перевірка досягнення крайньої верхньої точки

jne m6

 

mov ax,0004h ; установка курсору протилежну позицію

mov dx,198

 

int 33h

;------------------------------------------------

m6:

popa ; витягнути зі стеку всі занесені основні регістри

iret

endp

old_int: ; змінні для збереження старої адреси вектора intNumber

old_ip dw 0

old_cs dw 0

;------------------------------------------------

install:

mov ah, 35h

mov al, intNumber

int 21h ; отримати адресу попереднього вектора переривання intNumber

mov [old_ip], bx ; зберегти молодше слово адреси в old_ip

mov [old_cs], es ; зберегти старше слово адреси в old_cs

mov ah, 25h

mov al, intNumber

mov dx, offset DarkFunction

int 21h ; встановити нову адресу вектора

mov dx, offset instal l ; завершити роботу i залишити резидентною

int 27h ;частину програми по мітку install

ends

end start

ОПИС РОБОТИ

Програма складається з двох частин : резидентної, в якій виконуються безпосередньо завдання роботи і загрузчика, який заносить резидентну частину в пам’ять.

На початку програми вибирається тип процесора і вказується номер переривання за яким слідкуватиме програма. Виконання програми починається із мітки start.

Резидентна частина починається із задання функції 0003h, яка дозволяє отримати поточні координати курсору.

Далі відбувається перевірка досягнення курсором маніпулятора досягнення крайніх допустимих точок по горизонтальній та вертикальній осі. Для цього користуємось командою порівняння cmp, за допомогою якої зрівнюєм значення регістрів у яких містяться поточні координати з максимально (мінімально) допустимими координатами. Якщо координати не співпадають - продовжуєм перевірку, поки всі крайні позиції не будуть перевірені. Якщо курсор маніпулятора потрапив на позицію, вказану в операнді з яким порівнюється поточний регістр - курсор буде переміщено на протилежну крайню позицію екрану за допомогою команди mov.

Наступною йде команда витягнення всіх основних регістрів зі стеку - pusha. Також задаються змінні для тимчасового збереження старої адреси вектора intNumber.

Загрузчик починається від мітки install.

Спочатку отримуємо адресу попереднього вектора переривання intNumber , далі зберігаєм старші і молодші 16 біт адреси у відповідні змінні old_cs та old_ip.

Завершуємо програму установкою нової адреси вектора переривання, присвоївши старшому байту регістру АХ значення 25h.

ВИСНОВКИ

В результаті виконання курсового проектування було написано резидентну програму, що забезпечує виконання ефекту загортання курсору маніпулятора «миша». Наведено блок-схему програми, подано


Сторінки: 1 2