- •Новосибирский государственный технический университет
- •Лабораторная работа № 2 обработка массивов данных. Интерфейс с языками высокого уровня.
- •Лабораторная работа n 3 прерывания. Интерфейс с базовой системой ввода - вывода
- •Лабораторная работа n 4 программные прерывания. Интерфейс с операционной системой
- •Обработка аппаратных (асинхрониых) прерываний.
- •Лабораторная работа n 6 программы, резидентные в памяти (tsr).
Лабораторная работа n 4 программные прерывания. Интерфейс с операционной системой
1.Цель работы
Ознакомиться с основными функциями прерывания INT 21 - интерфейса с DOS.
2. Краткие теоретические сведения
Для обращения к операционной системе DOS используются ряд программных прерываний в диапазоне 20h-3Fh. Наиболее часто используются подфункции прерывания INT 21Н. Они позволяют достаточно просто организовать работу с различными внешними устройствами - клавиатурой, видеомонитором, принтером, асинхронным последовательным портом ввода - вывода и др.
Вызов всех функций выполняется аналогично обращениям к BIOS: в регистр АН помещается номер функции, необходимые параметры - в другие регистры. После выполнения функции результат возвращается также в регистрах. Значения всех регистров, кроме используемых для передачи параметров, сохраняются.
Основные функции прерывания INT 21H, используемые в лабораторной работе:
1. Ввод символа с ожиданием и эхо-печатью
Вход: АН = 1Н
Выход: AL * код символа
2. Ввод символа с ожиданием без эхо-печати
Вход: АН - 7Н
Выход: AL - код символа
3. Чтение строки с клавиатуры в буфер до CR
Вход: АН = ОАН
DS:DX - адрес буфера. Первый байт буфера - его длина
Выход: DS:DX - адрес буфера. Действительная длина строки во втором байте буфера, строка начинается с третьего байта.
4. Вывод символа
Вход: АН = 2Н
DL - код символа
5. Вывод строки символов
Вход: АН = 9Н
DS:DX - адрес строки. Признак конца строки - символ «$»
6. Чтение системной даты
Вход: АН = 2АН
Выход: СХ - Год (1980 - 2099)
DH - месяц (1-12)
DL - число (1-31).
7. Установка системной даты
Вход: АН = 2ВВ
СХ – год (1980 - 2099)
DH - месяц (Г-12)
DL - число (1-31)
Выход: AL = 0 - все в порядке, FFH - ошибка в задании даты
8. Чтение системного времени
Вход: АН = 2СН
Выход: CH - часы (0-23)
CL - минуты (0-59)
DH - секунды (0-59) DL - сотые доли секунды (0-99)
9. Установка системного времени
Вход: АН = 2DH
СН - часы (0-23)
CL - минуты (0-59)
DH - секунды (0-59) DL - сотые доли секунды (0-99)
Выход: AL = О - все в порядке
AL = OFFH - ошибка в задании времени
10. Чтение имени текущего каталога
Вход: АН = 47Н
DL = номер диска (1 -"А", 2 - "В" и т.д.)
DS:SI - адрес буфера (не менее 64 байт)
Выход: DS:SI - адрес имени каталога (заканчивается О)
11. Чтение имени текущего каталога
Вход: АН = 47Н
DL = номер диска (1 -"А", 2 - "В" и т.д.)
DS:SI - адрес буфера (не менее 64 байт)
Выход: DS:SI - адрес имени каталога (заканчивается О)
12. Информация о свободном пространстве на диске
Вход: АН = 36Н
DL = номер диска (1 -"А", 2 - "В" И Т.Д.)
Выход: AX - число секторов в кластере
ВХ - число свободных кластеров
СХ - число байтов в секторе
DX - общее число кластеров
3. Методические указания
В лабораторной работе требуется написать ассемблерную процедуру, вызываемую из СИ-программы и выполняющую действия, связанные с обращением к DOS.
Обратите внимание на необходимость сохранения - восстановления регистра DS, если он используется для передачи параметров.
Ввод исходных данных и вывод результата выполняются в СИ-программе.
4. Порядок выполнения работы
1. Написать головную программу на Си для вызова функции обработки строк, содержащую:
- прототип ассемблерной функции
- ввод исходных данных с подсказками
- вызов ассемблерной функции
- вывод результата работы функции
2. Написать ассемблерную функцию, выполняющую действия в соответствии с приведенным ниже описанием и прототипом.
3. Выполнить компиляцию и компоновку программы и произвести ее отладку.
Задания к лабораторной работе.
Вариант 1.
Написать функцию, выполняющую ввод строки с клавиатуры с эхо-печатью .и контролем длины. Прототип функции:
int len = varl(char *buf, int maxlen);
len - действительная длина строки
buf - массив для ввода строки
maxlen - длина массива buf (максимальная длина строки)
Вариант 2.
Написать функцию для чтения/установки системной даты. Прототип функции:
void var2(int *day, Int *month, Int *year, int flag);
day - день
month - месяц
year - год
flag - Режим работы: 0 - чтение даты, 1 - установка даты
Вариант 3.
Написать функцию для чтения/установки системного времени. Прототип функции:
void var3(int •hour, int.*min. int *sec, int flag);
hour- часы
min - минуты
sec - секунды
flag - Режим работы:
0 - чтение времени,
1 - установка времени
Вариант 4.
Написать функцию для ввода строки пароля. Функция должна вводить строку, выводя на экран вместо эхо-печати указанный символ. Прототип функции:
int len = var4(char *str, int sym);
len - длина введенной строки
str - буфер для ввода строки
sym - символ-заполнитель для печати
Вариант 5.
Написать функцию для чтения текущего каталога. Прототип функции:
int len = var5(char *dir, char disk);
len - действительная длина инени каталога
dir - буфер для записи имени каталога
disk - символьное обозначение диска ('А', 'В', ...)
Вариант 6.
Написать функцию для проверки свободного пространства на диске. Прототип функции:
void var6(char disk, int *free, int *sect, int *bytes);
disk - символьное обозначение диска ('А', 'В', ...)
free - число свободных кластеров
sect - число секторов в кластере
bytes - число байтов в секторе
5. Контрольные вопросы
1. Структура таблицы прерываний
2. Алгоритм выполнения команды INT
3. Общие правила работы с интерфейсом DOS
Лабораторная работа N 5