
- •Системне програмування
- •Переривання (Системні виклики). Механізм і типи переривань
- •Обслуговування переривань
- •Io.Sys і msdos.Sys
- •Маскування переривань
- •Зміна таблиці векторів переривань
- •Корекція системних обробників переривань
- •Використання переривань
- •1. Використання групи функцій переривання dos int 21h, при цьому номер функції цього переривання вказується в регістрі ah:
- •2. Посимвольний ввід шляхом звертання до драйвера bios за допомогою переривання int 16h
- •Int 16h
- •3. Звертання до клавіатури, як до файлу.
- •1. Використання групи функцій переривання dos int 21h, при цьому номер функції цього переривання вказується в регістрі ah:
- •2. Звертання до пристрою виводу(монітору), як до файлу.
- •Найбільш важливі переривання bios
- •Найбільш важливі переривання dos
- •Таблиця векторів переривань
Корекція системних обробників переривань
Якщо необхідно додати які-небудь власні дії до тих, що виконує стандартний обробник переривання, можна організувати ланцюжок переривань. Для організації ланцюжка переривань необхідно записати в таблицю векторів адресу власного обробника, попередньо зберігши попереднє значення елементу, що записується. Обробник користувача отримує управління по перериванню, виконує свої дії, потім передає управління стандартному обробнику. В разі необхідності можна вставити додаткову обробку після виклику стандартного обробника.
Використання переривань
При програмуванні на мові асемблер, переривання найчастіше використовуються для операцій вводу даних з клавіатури та виводу даних на екран. Тому доцільно зупинитися саме на таких перериваннях.
Вводити та виводити дані можна по одному символу або рядком символів.
Ввід з клавіатури можна здійснювати трьома способами:
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:- скидання вхідного буфера і ввід;