Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Мультиплексорное прерывание




Если вы запустите предыдущий пример несколько раз, с разными или даже одинаковыми именами дисков в командной строке, объем свободной памяти DOS каждый раз будет уменьшаться на 208 байт, то есть каждый новый запуск устанавливает дополнительную копию резидента, даже если она идентична уже установленной. Разумеется, это неправильно — инсталляционная часть обязательно должна уметь определять, загружен ли уже резидент в памяти перед его установкой. В нашем случае это не приводит ни к каким последствиям, кроме незначительного уменьшения объема свободной памяти, но во многих чуть более сложных случаях могут возникать различные проблемы, например многократное срабатывание активного резидента по каждому аппаратному прерыванию, которое он перехватывает.

Для того чтобы идентифицировать себя в памяти, резидентные программы обычно или устанавливали обработчики для неиспользуемых прерываний, или вводили дополнительную функцию в используемое прерывание. Например: наш резидент мог бы проверять в обработчике INT 21h АН на равенство какому-нибудь числу, не соответствующему функции DOS, и возвращать в, например, AL код, означающий, что резидент присутствует. Очевидная проблема, связанная с таким подходом, — вероятность того, что кто-то другой выберет то же неиспользуемое прерывание или что будущая версия DOS станет использовать ту же функцию. Именно для решения этой проблемы, начиная с версии DOS 3.3, был предусмотрен специальный механизм, позволяющий разместить до 64 резидентных программ в памяти одновременно, — мулыпиплексорное прерывание.

INT 2Fh: Мультиплексорное прерывание

Ввод: АН = идентификатор программы 00h – 7Fh зарезервировано для DOS/Windows B8h – BFh зарезервировано для сетевых функций C0h – FFh отводится для программ AL = код функции 00h — проверка наличия программы остальные функции — свои для каждой программы ВХ, СХ, DX = 0 (так как некоторые программы выполняют те или иные действия в зависимости от значений этих регистров)
Вывод: Для подфункции AL = 00h, если установлен резидент с номером АН, он должен вернуть 0FFh в AL и какой-либо идентифицирующий код в других регистрах, например адрес строки с названием и номером версии.

 

Оказалось, что такого уровня спецификации совершенно недостаточно и резидентные программы по-прежнему работали по-разному, находя немало способов конфликтовать между собой. Поэтому появилась новая спецификация — AMIS (альтернативная спецификация мультиплексорного прерывания). Все резидентные программы, следующие этой спецификации, должны поддерживать базовый набор функций AMIS, а их обработчики прерываний должны быть написаны в соответствии со стандартом IBM ISP, который делает возможным выгрузку резидентных программ из памяти в любом порядке.

Начало обработчика прерывания должно выглядеть следующим образом:

+00h: 2 байта — 0EBh, 10h (команда jmp short на первый байт после этого блока)

+02h: 4 байта — адрес предыдущего обработчика: именно по адресу, хранящемуся здесь, обработчик должен выполнять call или jmp

+06h: 2 байта — 424Вh — сигнатура ISP-блока

+08h: байт — 80h, если это первичный обработчик аппаратного прерывания (то есть он посылает контроллеру прерываний сигнал EOI). 00h, если это обработчик программного прерывания или дополнительный обработчик аппаратного

+09h: 2 байта — команда jmp short на начало подпрограммы аппаратного сброса — обычно состоит из одной команды IRET

+0Bh: 7 байт — зарезервировано

Все стандартное общение с резидентной программой по спецификации AMIS происходит через прерывание 2Dh. При установке инсталляционная часть резидентной программы должна проверить, не установлена ли ее копия, просканировав все идентификаторы от 00 до 0FFh, и, если нет, установить обработчик на первый свободный идентификатор.

INT 2Dh: Мультиплексорное прерывание AMIS

Ввод: АН = идентификатор программы AL = 00: проверка наличия AL = 01: получить адрес точки входа AL = 02: деинсталляция AL = 03: запрос на активизацию (для «всплывающих программ») AL = 04: получить список перехваченных прерываний AL = 05: получить список перехваченных клавиш AL = 06: получить информацию о драйвере (для драйверов устройств) AL = 07 – 0Fh — зарезервировано для AMIS AL = 1Fh – 0FFh — свои для каждой программы
Вывод: AL = 00h, если функция не поддерживается

Рассмотрим функции, описанные в спецификации AMIS как обязательные.

INT 2Dh AL = 00h: Функция AMIS — проверка наличия резидентной программы

Ввод: АН = идентификатор программы AL = 00h
Вывод: AL = 00h, если идентификатор не занят AL = FFh, если идентификатор занят СН = старший номер версии программы CL = младший номер версии программы DX:DI = адрес AMIS-сигнатуры, по первым шестнадцати байтам которой и происходит идентификация Первые 8 байт — имя производителя программы, следующие 8 байт — имя программы, затем или 0 или ASCIZ-строка с описанием программы, не больше 64 байт.

INT 2Dh AL = 03h: Функция AMIS — выгрузка резидентной программы из памяти

Ввод: АН = идентификатор программы AL = 02h DX:BX = адрес, на который нужно передать управление после выгрузки
Вывод: AL = 01h — выгрузка не удалась AL = 02h — выгрузка сейчас невозможна, но произойдет чуть позже AL = 03h — резидент не умеет выгружаться сам, но его можно выгрузить, резидент все еще активен ВХ = сегментный адрес резидента AL = 04h — резидент не умеет выгружаться сам, но его можно выгрузить, резидент больше неактивен ВХ = сегментный адрес резидента AL = 05h — сейчас выгружаться небезопасно — повторить запрос позже AL = 06h — резидент был загружен из CONFIG.SYS и выгрузиться не может, резидент больше неактивен AL = 07h — это драйвер устройства, который не умеет выгружаться сам ВХ = сегментный адрес AL = 0FFh с передачей управления на DX:BX — успешная выгрузка

INT 2Dh AL = 03h: Функция AMIS — запрос на активизацию

Ввод: АН = идентификатор программы AL = 03h
Вывод: AL = 00h — резидент — «невсплывающая» программа AL = 01h — сейчас «всплывать» нельзя — повторить запрос позже AL = 02h — сейчас «всплыть» не могу, но «всплыву» при первой возможности AL = 03h — уже «всплыл» AL = 04h — «всплыть» невозможно ВХ,СХ — коды ошибки AL = 0FFh — программа «всплыла», отработала и завершилась ВХ — код завершения

INT 2Dh AL = 04h: Функция AMIS — получить список перехваченных прерываний

Ввод: АН = идентификатор программы AL = 04h
Вывод: AL = 04h DX:BX = адрес списка прерываний, состоящего из 3-байтных структур: байт 1: номер прерывания (2Dh должен быть последним) байты 2,3: смещение относительно сегмента, возвращенного в DX обработчика прерывания (по этому смещению должен находиться стандартный заголовок ISP)

INT 2Dh AL = 05h: Функция AMIS — получить список перехваченных клавиш

Ввод: АН = идентификатор программы AL = 05h
Вывод: AL = 0FFh — функция поддерживается DX:BX = адрес списка клавиш: +00h: 1 байт: тип проверки клавиши: бит 0: проверка до обработчика INT 9 бит 1: проверка после обработчика INT 9 бит 2: проверка до обработчика INT 15h/AH = 4Fh бит 3: проверка после обработчика INT 15h/AH = 4Fh бит 4: проверка при вызове INT 16h/AH = 0, 1, 2 бит 5: проверка при вызове INT 16h/AH = 10h, llh, 12h бит 6: проверка при вызове INT 16h/AH = 20h, 21h, 22h бит 7: 0 +01h: 1 байт: количество перехваченных клавиш +02h: массив структур по 6 байт: байт 1: скан-код клавиши (старший бит — отпускание клавиши, 00/80h — если срабатывание только по состоянию Shift-Ctrl-Alt и т.д.) байты 2, 3: необходимое состояние клавиатуры (формат тот же, что и в слове состояния клавиатуры, только бит 7 соответствует нажатию любой клавиши Shift) байты 4, 5: запрещенное состояние клавиатуры (формат тот же) байт 6: способ обработки клавиши бит 0: клавиша перехватывается после обработчиков бит 1: клавиша перехватывается до обработчиков бит 2: другие обработчики не должны «проглатывать» клавишу бит 3: клавиша не сработает, если, пока она была нажата, нажимали или отпускали другие клавиши бит 4: клавиша преобразовывается в другую бит 5: клавиша иногда «проглатывается», а иногда передается дальше биты 6, 7: 0

Теперь можно написать резидентную программу, которая не загрузится дважды в память. В этой программе установим дополнительный обработчик на аппаратное прерывание от клавиатуры IRQ1 (INT 9), который будет отслеживать комбинацию клавиш Alt-А; после их нажатия программа перейдет в активное состояние, выведет на экран свое окно и среагирует уже на большее количество клавиш. Такие программы, активизирующиеся по нажатию какой-либо клавиши, часто называют «всплывающими» программами, но наша программа на самом деле будет только казаться «всплывающей». Настоящая «всплывающая» программа после активизации в обработчике INT 9h не возвращает управление, пока пользователь не закончит с ней работать. В нашем случае управление возвратится после каждого нажатия клавиши, хотя сами клавиши будут поглощаться программой, так что можно ей пользоваться одновременно с работающими программами, причем на скорости их работы активный ascii.com никак не скажется.

Так же как и с предыдущим примером, программы, не использующие средства DOS/BIOS для работы с клавиатурой, например файловый менеджер FAR, будут получать все нажатые клавиши параллельно с нашей программой, что приведет к нежелательным эффектам на экране. Кроме того, в этом упрощенном примере отсутствуют некоторые необходимые проверки (например, текущего видеорежима) и функции (например, выгрузка программы из памяти), но тем не менее это — реально используемая программа, с помощью которой легко посмотреть, какой символ соответствует какому ASCII-коду, и ввести любой символ, которого нет на клавиатуре, в частности псевдографику.

 





Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 565; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.