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

Корекція системних обробників переривань

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

Використання переривань

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

Вводити та виводити дані можна по одному символу або рядком символів.

Ввід з клавіатури можна здійснювати трьома способами:

1. Використання групи функцій переривання dos int 21h, при цьому номер функції цього переривання вказується в регістрі ah:

AH=01: Ввід символу з клавіатури з еховідображенням. Дана функція повертає значення в регістрі AL. Якщо вміст AL не дорівнює нулю, то воно являє собою стандартний ASCII- cимвол, наприклад, букву або цифру. Нульове значення в регістрі AL свідчить про те, що на клавіатурі була натиснута спеціальна функціональна клавіша, наприклад, Номе, F1 або PgUp. Для визначення скен-коду клавіш, необхідно повторити виклик функції Дана функція реагує на запит Ctrl/Break.

.code

mov ax,@data

mov ds,ax

MOV AH,01H ;Запит функції вводу

INT 21H ;Викликати DOS

AH=06: Прямий ввід з клавіатури і вивід на екран.

AH=07: Прямий ввід із клавіатури без еховідображення. Дана функція працює аналогічно функції 01 із двома відмінностями: введений символ не відображається на екрані, тобто немає еха, і відсутня реакція на запит Ctrl/Break.

AH=08: Ввід із клавіатури без еховідображення. Дана функція діє аналогічно функції 01 з однією відмінністю: введений символ не відображається на екрані.

AH=0Ah - буферизований ввід стрічки з еховідображенням;

Для використання даної функції область вводу вимагає наявності cписку параметрів, що містить поля, які необхідні при виконанні команди INT. По-перше, повинна бути визначена максимальна довжина тексту, що вводить. Це необхідно для попередження користувача звуковим сигналом, якщо набрано занадто довгий текст; символи, що перевищують максимальну довжину не приймаються. По-друге, у списку параметрів повинне бути певне поле, куди команда повертає дійсну довжину уведеного тексту в байтах. Нижче наведений приклад, у якому визначений список параметрів для області вводу. LABEL являє собою директиву з атрибутом BYTE. Перший байт містить максимальну довжину даних, що вводять. Оскільки це однобайтовое поле, те можливе максимальне значення його - FFh або 255. Другий байт необхідний DOS для занесення в нього дійсної кількості введених символів. Третім байтом починається поле, що буде безпосередньо містити введені символи.

.data

NAMEPAR LABEL BYTE ;Список параметрів:

MAXLEN DB 20 ; Максимальна довжина

ACTLEN DB ? ; Реальна довжина

NAMEFLD DB 20 DUP (' ') ; Уведені символи

Оскільки в списку параметрів директива LABEL не займає місця, то NAMEPAR і MAXLEN вказують на однакову aдресу пам’яті.

Для запиту на ввіду необхідно помістити в регістр AH номер функції - 10 ( 0AH), завантажити адресу списку параметрів (NAMEPAR у нашому прикладі) у регістр DX і виконати INT 21H:

.code

mov ax,@data

mov ds,ax

MOV AH,0AH ;Запит функції вводу

LEA DX,NAMEPAR ;Завантажити адреси списку параметрів

INT 21H ;Викликати DOS

Команда INT очікує поки користувач не введе із клавіатури текст, перевіряючи при цьому, щоб кількість введених символів не перевищувало максимального значення, зазначеного в списку параметрів (20 у нашому прикладі). Для вказівки кінця вводу користувач натискає клавішу Enter. Код цієї клавіші (0Dh) також заноситься в поле вводу (NAMEFLD у нашому прикладі). Якщо, наприклад, користувач ввів ім'я BROWN (Enter), то список параметрів буде містити інформацію:

Десяткові та символьні

значення

20

5

B

R

O

W

N

#

шістнадцяткові

14

05

42

52

4F

57

4E

0D

20

20

У другий байт списку параметрів (ACTLEN у нашому прикладі) команда заносить довжину уведеного імені - 05. Код Enter знаходиться за адресою NAMEFLD +5. Символ # використаний тут для індикації кінця даних, тому що 0Dh не має відображуваного символу. Оскільки максимальна довжина в 20 символів включає 0Dh, то дійсна довжина тексту, що вводиться може бути тільки 19 символів.

AH=0Bh: Перевірка стану клавіатури. Дана функція повертає FFh у регістрі AL, якщо ввід із клавіатури можливий, у іншому випадку - 00. Цей засіб пов’язане з функціями 01, 07 і 08, які не очікують вводу з клавіатури.

AH=0Ch:- скидання вхідного буфера і ввід;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]