ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3129
Скачиваний: 1
прерываний передает управление тому коду, на который указывает
соответствующий вектор прерывания. Поскольку это аппаратное пре-
рывание, то оно может быть маскировано [1.2.2]. Помните, что
процедура обработки прерывания должна завершаться стандартным
кодом выхода из аппаратного прерывания MOV AL,20H/OUT 20H,AL. На
рис. 7-3 показано коммуникационное прерывание.
Любое число типов прерывания может быть разрешено одновремен-
но. Но если разрешен более чем один тип, то процедура обработки
прерывания должна сама определять какой из типов прерывания прои-
зошел, проверяя регистр идентификации прерывания. Одновременно
могут происходить более чем одно прерывание, поэтому бит 0 ре-
гистра идентификации сообщает о том, что поступило еще одно пре-
рывание. Когда два или более прерываний поступило в один и тот же
момент времени, то они обрабатываются в порядке, указанном в
нижеприведенной таблице. Добавочные прерывания должны быть обра-
ботаны до завершения процедуры обработки прерывания. Условия
предшествующих прерываний "отменяются" с помощью действий, при-
веденных в правом столбце следующей таблицы:
Код Тип Действия для "сброса"
11 ошибка или перерыв чтение регистра статуса линии
10 получены данные чтение регистра приемника данных
01 передатчик готов вывод символа в регистр хранения
передатчика
00 изменение статуса модема чтение регистра статуса модема
Низкий уровень.
Вот общая форма программы, обрабатывающей коммуникационные
прерывания:
;---установка вектора коммуникационного прерывания
PUSH DS ;сохраняем DS
MOV DX,OFFSET IO_INT ;DS:DX указывают на процедуру
MOV AX,SEG IO_INT ;
MOV DS,AX ;
MOV AL,0BH ;номер вектора для COM1
MOV AH,25H ;функция изменения вектора
INT 21H ;меняем вектор прерывания
;---инициализация регистра разрешения прерывания (COM1)
MOV AX,40H ;DS указывает на данные BIOS
MOV DS,AX ;
MOV DX,DS:[0] ;получаем базовый адрес COM1
INC DX ;указываем на регистр разрешения
MOV AL,3 ;прерываний и разрешаем прерывания
OUT DX,AL ;приема и передачи
POP DS ;восстанавливаем регистр
;---процедура обработки прерывания - сначала определяем его тип
IO_INT PROC FAR
NEXT_INT: MOV DX,BASEADDRESS ;базовый адрес
INC DX ;указываем на регистр идентификации
INC DX ;прерывания
IN AL,DX ;читаем его значение
TEST AL,10B ;это прерывание передатчика?
JNZ TRANSMIT ;если да, то на передачу
RECEIVE: ;иначе на прием
.
.
JMP SHORT ANOTHER ;проверяем нет ли другого прерывания
TRANSMIT: ;здесь код для передачи
.
.
;---перед выходом, проверяем нет ли другого прерывания
ANOTHER: MOV DX,BASEADDRESS ;базовый адрес
INC DX ;указываем на регистр идентификации
INC DX ;прерывания
IN AL,DX ;читаем его значение
TEST AL,1 ;проверяем бит 1
JNZ NEXT_INT ;если он установлен, то на начало
MOV AL,20H ;иначе код завершения аппаратного
OUT 20H,AL ;прерывания
IRET
IO_INT ENDP
7.1.9 Сводка управляющих кодов, используемых при коммуникации.
Эта таблица содержит 32 управляющих кода ASCII, которые ис-
пользуются при коммуникации, а также при работе принтера и других
устройств. Добавлен также код ASCII 127 - DEL (Забой), который
обычно используется как управляющий код, хотя его и нельзя выдать
с клавиатуры с помощью сочетания Ctrl + клавиша. Применение неко-
торых кодов, таких как возврат каретки, инвариантно. Но боль-
шинство других управляющих кодов имеют широкий диапазон интерпре-
тации, во многом из-за отсутствия совместимости оборудования.
Номер кода ASCII Комбинация Мнемо-
10-й 16-й Символ с Ctrl ника Назначение
00 00 ^@ NUL Символ-разделитель (не имеющий значения, поэтому полезен
для задержек)
01 01 ^A SOH Начало заголовка. Начинает передачу блока данных или но-
вого файла.
02 02 ^B STX Начало текста. Отмечает начало текста, следующего за за-
головком данных.
03 03 ^C ETX Конец текста. Может отмечать начало данных, служащих для
контроля ошибок.
04 04 ^D EOT Конец передачи. Код остановки, но иногда он просто отме-
чает конец файла.
05 05 ^E ENQ Запрос. Запрашивает статусную информацию у отдаленной станции.
06 06 ^F ACK Подтверждение. Подтверждает успешный обмен между станциями.
07 07 ^G BEL Звонок. Инициирует звонок, чтобы привлечь внимание.
08 08 ^H BS Возврат на шаг.
09 09 ^I HT Горизонтальная табуляция.
10 0A ^J LF Перевод строки.
11 0B ^K VT Вертикальная табуляция.
12 0C ^L FF Перевод формата.
13 0D ^M CR Возврат каретки.
14 0E ^N SO Сдвиг выключен. Переключает набор символов.
15 0F ^O SI Сдвиг включен. Переключает набор символов.
16 10 ^P DLE Data Link Escape. Модифицирует значение следующих символов
(аналогично Esc).
17 11 ^Q DC1 Управление устройством 1. Используется как сигнал XON для
удаленной станции на передачу.
18 12 ^R DC2 Управление устройством 2. Сигнал переключения общего назна-
чения.
19 13 ^S DC3 Управление устройством 3. Используется как сигнал XOFF для
удаленной станции для прекращения передачи.
20 14 ^T DC4 Управление устройством 4. Сигнал переключения общего назна-
чения.
21 15 ^U NAK Отрицание. Передача неуспешна.
22 16 ^V SYN Промежуток синхронизации. Используется между блоками данных
при синхронной связи.
23 17 ^W TB Конец блока передачи. Вариант ETX.
24 18 ^X CAN Отмена. Обычно сигнализирует об ошибке передачи.
25 19 ^Y EM Конец среды. Сигнализирует о физическом конце источника
данных.
26 1A ^Z SUB Подстановка. Заменяет символы, которые незаконны или невоз-
можно вывести.
27 1B ^[ ESC Отмечает последующие символы, как управляющую последова-
тельность.
28 1C ^/ FS Разделитель файлов. Отмечает логическую границу между фай-
лами.
29 1D ^] GS Разделитель групп. Отмечает логическую границу между груп-
пами данных.
30 1E ^^ RS Разделитель записей. Отмечает логическую границу между за-
писями данных.
31 1F ^_ US Разделитель объектов. Отмечает логическую границу между
объектами данных.
127 7F нет DEL Забой. Удаляет другие символы.
Раздел 2. Создание драйвера устройства.
Драйвер устройства это специальная программа, которая управ-
ляет обменом с периферийным устройством, таким как принтер или
дисковый накопитель. Поскольку параметры этих периферийных уст-
ройств меняются от производителя к производителю, то разным поль-
зователям программы может потребоваться дюжина различных драйве-
ров, чтобы он мог работать на имеющемся у него оборудовании.
Имеется 4 способа включения драйверов устройств в программу:
1. Можно поместить код для всех драйверов прямо в программу.
Например, чтобы поддерживать различные принтеры, можно создать
таблицу управляющих последовательностей и искать в ней нужный код
каждый раз когда он потребуется. Этот подход тратит много памяти
и может быть достаточно медленным.
2. Создать ряд драйверов устройств и потребовать, чтобы прог-
рамма загружала необходимый в качестве оверлея (т.е. помещать его
в область программы, специально оставленную для этой цели
[1.3.5]).
3. Создать драйвер устройства как отдельную программу, которая
указывается в командном файле, выполняемом при загрузке системы.
Программа запускается и устанавливает драйвер устройства как
программу обработки прерывания. После этого программа завершает-
ся, но остается резидентной в памяти, как объяснено в [1.3.4].
Впоследствии наша программа использует этот драйвер через вектор
прерывания.
4. Создать полноценный драйвер устройства, который будет заг-
ружаться при старте с помощью файла CONFIG.SYS. MS DOS поддержи-
вает такой тип драйверов устройств и однажды загруженный он может
использовать все возможности команд DOS, включая проверку ошибок.
Специальная команда IOCTL (Контроль ввода/вывода) позволяет прог-
рамме узнать статус драйвера и послать ему управляющую строку,
помимо обычного потока данных.
Первые три стратегии легко реализуются с помощью информации,
приведенной в остальных частях данной книги. Но устанавливаемые
драйверы устройств очень сложны. Зато когда он есть, то он очень
мощен. В этом случае система будет работать с устройством нас-
только же тесно, как с клавиатурой или дисковым накопителем.
Устройству может быть присвоено имя, например, SERIALPR для пос-
ледовательного принтера, и затем это устройство может быть откры-
то для доступа из любого языка. В Бейсике оператор OPEN "SE-
RIALPR" FOR OUTPUT AS #2 подготовит последовательный принтер для
вывода. В языке ассемблера Вы сможете получить доступ к принтеру
как с помощью метода управляющего блока файла, так и с помощью
метода дескриптора файла, включая очень мощную функцию IOCTL. При
этом пользователь имеет возможность доступа к устройству на уров-
не операционной системы и может просто ввести команду COPY A:MY-
FILE SERIALPR:, чтобы скопировать содержимое файла на принтер.
Устанавливаемые драйверы устройств могут быть написаны только
на языке ассемблера. Они могут обслуживать два типа устройств:
символьные и блочные. Эти имена описывают единицы, которыми уст-
ройство обрабатывает данные. Обычно драйверы блочных устройств
обслуживают дисковые накопители, а драйверы символьных - все
остальное, начиная от последовательных принтеров и кончая робота-
ми. Блочные устройства обмениваются блоками данных, поэтому они
занимаются накоплением данных. Символьные устройства обмениваются
данными побайтно, поэтому они лучше подходят для управляющих
устройств, а также для устройств, которые не могут обеспечить
высокую скорость обмена данными. Драйверы блочных устройств очень
сложны и здесь нет достаточно места, чтобы объяснить их структу-
ру. Очень редко кому требуется написать такой драйвер. Техничес-
кое руководство по MS DOS предоставляет всю необходимую информа-
цию и содержит полный пример драйвера виртуального диска в опера-
тивной памяти. Вы можете просмотреть эту информацию после того
как изучите обсуждение драйверов символьных устройств, приведен-
ное здесь.
Устанавливаемые драйверы устройств беспощадны к программистс-
ким ошибкам. Поскольку драйверы автоматически загружаются систе-
мой при загрузке, то невозможно использовать отладчики для выяв-
ления причин неполадок. Поэтому будьте предельно внимательны при
их написании.
Программа драйвера устройства разбивается на три части, каждая
из которых обсуждается отдельно в следующих разделах. Это (1)
заголовок драйвера, который именует устройство и содержит инфор-
мацию об остальных частях драйвера, (2) стратегия драйвера, кото-
рая хранит информацию об области данных, создаваемой MS DOS,
которая называетя заголовком запроса, и (3) обработчик прерывания
устройства, который и содержит код, управляющий устройством.
7.2.1 Создание заголовка драйвера.
Драйверы устройств должны создаваться в виде COM файлов
[1.3.6]. Однако они не являются настоящими программами, поскольку
у них отсутствует префикс программного сегмента. Чтобы добиться
этого не надо включать оператор ORG 100H в начале программы, как
это делается для COM файлов. Либо запишите ORG 0, либо вообще
ничего не пишите. Драйвер должен быть описан как далекая (far)
процедура, как и в любой программе. В нижеприведенном примере
приведен начальный код для драйвера устройства с именем DEVICE12.
Оно заменяет стандартное устройство AUX, используемое MS DOS,
принимая вывод функции 4 прерывания 21H. Весь драйвер устройства
состоит из кода этого раздела вместе с кодом, приведенном в сле-
дующих двух разделах; поместите их подряд один за другим, чтобы
получить полную программу.
Драйвер устройства должен начинаться с заголовка драйвера. Он
имеет длину 18 байтов, разделенных на 5 полей. Первое поле (DD)
всегда содержит значение -1 (FFFFFFFFH), и когда MS DOS загружает
драйвер, то оно заменяется на стартовый адрес следующего драйве-
ра. Таким образом, система может искать следующий драйвер по
цепочке. У последнего загруженного драйвера в этом поле остается
значение -1.
Второе поле это байт атрибутов драйвера. Имеют значение только
7 битов этого слова:
бит 15 1 = символьное устройство, 0 = блочное устройство
14 1 = поддерживает IOCTL, 0 = не поддерживает IOCTL
13 1 = формат блоков IBM, 0 = другой формат блоков
3 1 = часы, 0 = не часы
2 1 = нулевое устройство, 0 = не нулевое устройство
1 1 = устройство стандартного вывода, 0 = нет
0 1 = устройство стандартного ввода, 0 = нет
Обычно установлен только бит 15, или биты 15 и 14, если устройст-
во поддерживает IOCTL (как обсуждается в [7.2.4]). Бит 13 уста-
навливается только для блочных устройств. Остальные биты исполь-
зуются для замены устройств, используемых MS DOS по умолчанию
(устройствами стандартного ввода и вывода являются клавиатура и
видеодисплей; устройство часов объединяет часы реального времени
с часами времени суток BIOS; а нулевое устройство (NULL) - это
псевдоустройство, используемое для тестовых целей).
Третье и четвертое поля содержат смещения для процедур страте-
гии и обработки прерывания, которые будут рассмотрены в следующих
разделах. Наконец, последнее поле содержит имя устройства. Имя
может содержать до 8 символов и оно должно быть выравнено по
левому краю с завершающими пробелами. Для замены существующих в
DOS устройств, таких как LPT1 или COM1, используйте то же имя
устройства, как в данном примере.
Низкий уровень.
В данном примере создается драйвер для последовательного уст-