курсовий проект
з дисципліни: „Системне програмування та операційні
системи”
Тема: „Розробка резидентної програми”
Зміст
1. Опис основних функцій, що використані в програмі……………………
2. Структурна схема програми……………………………………………….
3. Блок-схема програми……………………………………………………..
4. Код програми з поясненнями(ремарками)…............................................
5. Опис роботи………………………………………………………………
6. Висновки
7. Використана література
Висновки
В результаті виконання курсового проектування розроблена резидентна програма, яка, в текстовому режимі роботи монітора, за допомогою маніпулятора „миша” дозволяє виділити і зберегти виділену частину робочого екрану у файл. Назва файлу вказується в командному рядку як параметр при запуску програми. Наведено структурну та блок-схему програми, подано опис її функціонування в середовищі MS-DOS. Текст програми написано на мові Assembler.
5. Опис роботи
Програма складається з резидентної частини (що залишається в оперативній пам’яті після завершення програми ) та загрузчика.
На початку програми вибирається модель пам’яті та тип процесора командами model та .386 відповідно. Виконання програми починається із мітки start. Першою ж командою здійснюється перехід на мітку real_start для того, щоб обійти блок змінних та процедуру обробки переривання.
Далі програма копіює ім’я файлу, що введено як параметр, в змінну file_name. Після цього здійснюється переадресування підпрограми обробки переривання int 08h на нашу резидентну функцію. Це здійснюється за допомогою функцій 25h та 35h переривання int 21h. Після цього програма передає управління DOS, залишаючись резидентною.
Резидентна частина програми реагує на апаратне переривання 08h, яке генерується апаратно 18,2 раза в секунду. Резидентна частина викликає стару
підпрограму переривання після цього здійснює моніторинг лівої кнопки маніпулятора типу «миша», зберігає координати натискання та відпускання лівої клавіші, зберігає виділений текст в змінній buffer та зберігає їх у файлі.
4. Код програми з поясненнями (ремарками)
model tiny ; вибір моделі пам’яті для компіляції сом-файлу
; CS=ES=SS=DS
codeseg ;початок кодового сегменту
.386 ;дозволити використання команд процесора 80386
org 100h ;зміщення в 256 байт для PSP
start: ;мітка першої інтрукції
jmp real_start ;перехід на реальний початок програми
;(обхід блоку даних та резидентної частини)
; оголошення змінних:
;координати точки нажаття лівої клавіші миші
poch_x_m db 0 ;координата по Х
poch_y_m db 0 ;координата по У
;координати точки відпускання лівої клавіші миші
kinc_x_m db 0 ;координата по Х
kinc_y_m db 0 ;координата по У
byte_info db 0 ;байт характеристики
old_int8_ip dw 0 ;зміщення старого вектора int 08h
old_int8_cs dw 0 ;сегмент старого вектора int 08h
file_name db 24 dup(0) ;ім’я файлу
buffer db 2000 dup(0) ;буфер
des dw 0 ;дескриптор файлу
kilk dw 0 ;кількіть байтів в даний момент в буфері
; ================= нова програма обробки переривання int 08h
interrupt:
pushf ;зберігаємо в стеці поточний стан прапорців для імітації
;виклику переривання
call dword ptr cs:[old_int8_ip] ;виклик старої програми обробки переривання
pusha ;зберігаєм регістри оперативного призначення
mov al, cs:byte_info ;заносимо в al байт характеристик
test al,04h ;перевіряєм поле F.z
jnz endi ;якщо встановлений в 1 – перехід в кінець програми
mov ax,0003h ;функція одержання статусу миші
int 33h ;виклик переривання
test bl,01h ;ліва клавіша натиснута
jz no_key_press ;якщо ні, перехід на мітку no_key_press
mov al, cs:byte_info ; заносимо в al байт характеристик
test al,01h ; перевіряєм поле L.n
jnz end_key ; якщо встановлений в 1 – перехід на міту end_key
shr cx,3 ; ділимо отримане значення Х на 8, бо в текстовому режимі роботи
; монітора один символ представлений 8-ма точками по Х та по У
mov cs:poch_x_m,cl ; запамятовуєм значення по Х в змінній poch_x_m
shr dx,3 ; ділимо отримане значення У на 8
mov cs:poch_y_m,dl ;запамятовуєм значення по У в змінній poch_y_m
mov cs:byte_info,01h ; заносимо в байт характеристик в поле L.n 1
end_key:
mov ax,0003h ;функція одержання статусу миші
int 33h ;виклик переривання
shr cx,3 ;ділимо отримане значення Х на 8
mov cs:kinc_x_m,cl ;запамятовуєм значення по Х в змінній kinc_x_m
shr dx,3 ;ділимо отримане значення У на 8
mov cs:kinc_y_m,dl ;запамятовуєм значення по У в змінній kinc_y_m
mov cs:byte_info,03h ; заносимо в байт характеристик в поле L.v 1
jmp endi ; перехід на мітку endi
no_key_press:
mov al, cs:byte_info ; заносимо в al байт характеристик
test al,03h ;перевіряєм поля L.n та L.v
jz endi ;якщо вони не рівні 1, то перехід на мітку endi
;;;;;zapus v faile
mov cs:byte_info,04h ;заносим в байт характеристик в поле F.z
mov ah, cs:poch_x_m ;заносим в ah координати Х точки нажаття лівої клавіші
mov al, cs:kinc_x_m ;заносим в al координати Х точки відпускання лівої клавіші
cmp al,ah ; ah>al?
jc mod_x ;якщо так то перехід на мітку mod_x
sub al,ah ;різниця початкових та кінцевих координат по Х
mod_x_ret:
mov ch, cs:poch_y_m ;заносим в сh координати У точки нажаття лівої клавіші
mov cl, cs:kinc_y_m ;заносим в сl координати У точки відпускання лівої клавіші
cmp cl,ch ; ch>cl?
jc mod_y ;якщо так то перехід на мітку mod_y
sub cl,ch ;різниця початкових та кінцевих координат по У
mod_y_ret
inc al
inc cl
mul cl ;визначення кількості байт в buffer
mov cs:kilk,ax ;заносим це значення в змінну buffer
;організація циклу заповнення буферу символами, що відзначені мишкою
mov ch, cs:poch_x_m ;заносим в ch координати Х точки нажаття лівої клавіші
mov cl, cs:poch_y_m ;заносим в сl координати У точки нажаття лівої клавіші
xor di,di ;обнулюєм di
;цикл
cycle1:
inc cl
mov ch, cs:poch_x_m
cycle2:
;установка курсору
mov ah,02h ; заносимо номер функції установки курсору в аh
mov dh,cl ; в dh - координати Х символу
mov dl,ch ; в dl - координати У символу
xor bh,bh ; в bh - номер сторінки відеопамяті
int 10h
;отримуємо символ із цієї позиції і заносимо в буфер
mov ah,08h ; заносимо номер функції в