Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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, используйте то же имя

устройства, как в данном примере.


Низкий уровень.


В данном примере создается драйвер для последовательного уст-