Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.74 Mб
Скачать

5.6. Результаты работы программы

В процессе работы программы на экран была выведена следующая информация:

-----------------------------------------------------------------------------

-------------- Лабораторная работа N10 -------------

-------------- Управление программами -------------

Адрес PID = 0BA0

Команды:

--------

Завершение - int 20h: CD 20

Старый вызов DOS: 9A F0 FE 1D F0

Новый вызов DOS: CD 21 CB

Адреса:

-------

Конец памяти: 9FC0:0000

Обработчик завершения: 0AFA:02B1

Обработчик Ctrl+Break: 0AFA:014A

Обработчик критич.ошибки: 0AFA:0155

Стек: 0E04:0F94

Родитель: 0AFA

Таблица файлов: 0BA0:0018 (20) - в этом же PSP

1 1 1 0 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Окружение DOS: 0A1E

CONFIG=STD

COMSPEC=C:\DOS\COMMAND.COM

PROMPT=$p$g

PATH=D:\WIN;C:\;C:\DOS;C:\ARH;C:\NC;C:\BAT;D:\TP;D:\TP7;D:\BC\BIN

TEMP=d:\~TMP

Число строк вызова: 1

D:\TC\TC_LAB10.EXE

Лабораторная работа № 11. Драйверы DOS

1. Цель работы

Просмотреть список драйверов, которые в данный момент загружены в конкретной ПЭВМ.

2. Темы для предварительной проработки

  • Системные управляющие блоки DOS.

  • Драйверы устройств.

3. Постановка задачи

Определить драйверы, резидентные в памяти компьютера на своем рабочем месте.

4. Порядок выполнения работы

Порядок выполнения работы и содержание отчета определены в общих указаниях.

5. Пример решения задачи

5.1. Разработка алгоритма решения

5.1.1. Структура программы

Программа состоит из основной программы main() и девяти вспомогательных функций.

  • Функции GetSym, GetAtr, PutSym, PutAtr описаны в лабораторной работе N7.

  • void clrbuf(void) - функция очищает буфер клавиатуры.

  • void MemW(x,y,xr,yr) - функция запоминает содержимое области экрана.

  • void RmmW(x,y,xr,yr) - функция восстанавливает сохраненную область экрана функцией MemW на экране.

  • void ClrW(x1,y1,x2,y2,s,a) - функция очищает прямоугольную область на экране заданным символом и атрибутом.

  • void FlDrv(void) - функция выводит в окно подробное описание атрибутов драйвера.

5.1.2. Описание переменных

Переменные глобальные для всей программы:

  • xk,yk - координаты курсора;

  • cc - переменная для хранения кода нажатой клавиши;

  • bm[rx][ry][2] - буфер для запоминания области на экране.

В программе описана следующая структура заголовка драйвера:

struct DR_HEAD {

struct dr_head *next; /* адрес следующего */

word attr; /* атрибуты */

word strat_off, intr_off; /* смещения секций */

char name[8]; /* имя */

};

5.1.3. Описание алгоритма программы

Основная программа main() осуществляет просмотор списка драйверов и выводит на экран информацию о них при помощи вспомогательных функций.

Функция clrbuf(void) читает символы из буфера клавиатуры, пока он не опустеет.

Функция MemW(x,y,xr,yr) использует для обращения к видеопамяти функции GetSym, GetAtr. x, y - координаты левого верхнего угла прямоугольной области экрана. 8xr, yr - размеры области по горизонтали и вертикали соответственно.

Функция RmmW(x,y,xr,yr) использует для обращения к видеопамяти функции PutSym, PutAtr. x, y - координаты левого верхнего угла прямоугольной области экрана. xr, yr - размеры области по горизонтали и вертикали соответственно.

Функция ClrW(x1,y1,x2,y2,s,a) - использует для обращения к видеопамяти функции PutSym, PutAtr. x1, y1, x2, y2 - координаты прямоугольной области. s, a - символ и атрибут соответственно для заполнения области экрана.

Функция FlDrv(void) рассматривает побитно байт атрибута драйвера и может выдавать информацию в соответствии со значением атрибута.

Слово атрибутов драйвера в старшем разряде содержит признак символьного (1) или блочного (0) устройства. Интерпретация остальных разрядов слова атрибутов существенно разная для символьных и блочных устройств. Для символьных устройств слово атрибутов имеет формат:

1 e b 0 p 0 0 0 0 l 0 0 c n o i,

а для блочных устройств:

0 e m 0 p 0 0 0 0 l 0 0 0 0 s 0,

где 

i - драйвер консоли ввода;

 

o - драйвер консоли вывода;

 

n - драйвер нулевого (пустого) устройства;

 

c - драйвер часов;

 

l - драйвер поддерживает функции, введенные в DOS 3.2;

 

p - драйвер выполняет операции Open/Close;

 

b - драйвер неIBM-овского блочного устройства;

 

e - драйвер поддерживает функции IOCTL;

 

s - драйвер поддерживает 32-битную адресацию сектора;

 

m - драйвер определяет тип диска проверкой 1-го байта FAT.

По правилам DOS кодовая часть драйвера состоит из двух секций, называемых секцией стратегии и секцией обработки прерываний. Поля strat_off и intr_off заголовка содержат смещения этих секций от начала драйвера. Поле name для символьного устройства содержит имя устройства (возможно, дополненное пробелами), а для блочного - первый байт этого поля содержит количество устройств, поддерживаемых драйвером.

При помощи поля next, заполняемого системой при загрузке драйвера, все драйверы (системные и устанавливаемые) связываются в список. Начало этого списка - заголовок драйвера NUL в CVT. Значение FFFFh в части смещения поля next является признаком конца списка (такой же признак конца используется и в списках, образуемых другими управляющими блоками). Главная программа примера отслеживает этот список.