Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота N5.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
122.88 Кб
Скачать

Int 33h ; регістрація адреси та умов виклику

pop es

Після задання функції 0сh виникає якісно нова ситуація - процедура prmaus буде викликатись не залежно від основної програми. Виклик процедури prmaus буде виконувати драйвер мишки і тільки в випадку виникнення вибраної події (в нашому прикладі при любому переміщенню мишки або при натисканні правої кнопки мишки). Таким чином досягається ефект незалежної і "одночасної" роботи двох програм - основної програми і процедури . При цьому процедура користувача (prmaus) буде викликатись драйвером мишки коли користувач за ПЕОМ виконає вручну відповідні дії з мишкою ( в нашому прикладі коли користувач перемістить мишку по коврику або натисне праву кнопку)

    1. Вимоги до процедури обробки подій:

  • Процедура повинна бути типу far

  • В процедурі необхідно зберегти в стеку вміст регістрів ,що використовуються, з наступним відновленням вмісту регістрів перед поверненням

  • В процедурі необхідно встановити свої значення сегментних регістрів для даних оскільки драйвер мишки "не знає" з якими сегментами працює програма користувача

Приклад організації процедури prmaus

prmaus proc far

; збереження вмісту регістрів ds, es та РЗП

push ds

push es

pusha

;завантаження сегментних регістрів ds та es

push 0b800h ; сегментна адреса відеобуфера

pop es

push _data ;

pop ds

;основне тіло процедури:

;

popa

pop es

pop ds

ret

prmaus endp

Драйвер мишки передає процедурі обробки подій наступні параметри:

  • ax - умова виклику

  • bx - стан кнопок мишки:

біт 0 = 1 натиснута ліва кнопка

біт 1 = 1 натиснута права кнопка

біт 2 = 1 натиснута середня кнопка

  • сх - х - координата (по горизонталі екрану) курсору в пікселях (стовпчики)

  • dx - y - координата (по вертикалі) курсору в пікселях (рядки)

(щоб отримати координати в символах необхідно розділити вміст cx і dx на 8)

    1. Вимоги до основної програми.

Основна програма виконує свій алгоритм і може синхронізувати свою роботу з процедурою обробки подій від мишки через спільні змінні. Розглянемо наступні приклади.

Приклад 1.

Одним із найпростіших алгоритмів основної програми є очікування введення довільного символу з клавіатури ПЕОМ з наступним закінченням роботи програми.

mov ah, 01h ; ввести символ з клавіатури ПЕОМ

Int 21h ; виклик функції dos

jmp exit

Приклад 2.

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

Структури даних програми користувача:

dvalue db 30 dup ('0',0fh) ;зарезервовано 30 десяткових розрядів змінної dvalue

;в розпакованому двійково-десятковому форматі

;з початковим значенням 0 та байтами атрибутів -

;білий колір цифри на чорному фоні

len dw 10 ;реальна кількість десяткових розрядів змінної dvalue

row dw 23 ;рядок екрану, де відображається змінна

col dw 40 ;початкова позиція (старший розряд) відображення

; dvalue в рядку

valadd db 1 ;значення, яке додається до dvalue

cont db 0ffh ;ознака продовження роботи

Відображення значення змінної dvalue на екран (вважається, що необхідні адреси сегментів в регістри DS та ES записані):

@write: ; відображення dvalue

сli ; заборона переривань, щоб мишка "не мішала"

mov si,offset dvalue

mov al,byte ptr row ; обчислення Nrow 802 + Ncolumn 2

mov ah,0

imul ax,(80*2)

add ax,col

add ax,col ; завершення обчислення

mov di,ax

mov cx,len

cld

rep movsw ;виведення на екран

sti ;переривання дозволяються

Додавання до dvalue значення valadd в розпакованому двійково-десятковому форматі

@9: ; додавання чергового значення :

mov si,len

shl si,1

sub si,2 ;визначення адреси молодшої цифри dvalue

mov ah,0 ;початкове значення перенесення в старший

;десятковий розряд

mov al, dvalue[si]

add al,valadd

aaa ;корекція при додаванні розпакованих

;двійково-десяткових чисел

or al,30h ;формування коду ASCII десяткової цифри

mov dvalue[si],al

@10:

dec si

dec si

mov al,ah

mov ah,0

add al,dvalue[si] ;додавання перенесення

aaa

or al,30h

mov dvalue[si],al

cmp si,0

jnz @10

mov al,cont ;аналіз ознаки продовження роботи програми

cmp al,0ffh

je @write

jmp exit

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

При завершенні програми перед поверненням в DOS необхідно повторити виклик функції драйвера мишки 0ch, але зі значенням cx=0. Завдяки цьому драйвер мишки припинить виклики процедури prmaus:

exit:

xor cx,cx ;cx=0

mov ax,0ch

;вважаємо що регістри es:dx містять логічну адресу процедури prmaus

int 33h ;процедура prmaus

;далі викликатись не буде

УВАГА. Якщо основна програма передасть управління DOS без виконання цієї послідовності команд, то драйвер мишки може продовжувати виклик процедури prmaus. В свою чергу DOS може записати на місце процедури prmaus якусь другу програму, що може привести до не передбачуваних наслідків, включаючи знищення файлів на дисках.