Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
97
Добавлен:
09.02.2015
Размер:
5 Мб
Скачать
☆

Глава 8: Вызовы обработчиков прерываний

При возврате в регистре AH – код завершения из таблицы A.06-1, если флаг CF сброшен, то дисковод свободен,

если флаг CF установлен, то дисковод занят.

Примечание 1: прежде чем

вызывать INT 15\AH=52h, надо

с помощью

INT 13\AH=41h определить, поддерживается ли эта функция в

данном компьютере.

 

Примечание 2: по умолчанию BIOS устанавливает "заглушку", которая на вызовы

INT 15\AH=52h

всегда отвечает CF=0. Вызовы

INT 15\AH=52h

перехватывает программа кэширования, и только тогда ответ будет отражать реальное состояние процесса обмена данными.

8.01-70 INT 15\AX=5301h – активизация управления электропитанием.

В момент включения компьютера программное управление электропитанием (APM) не активизируется автоматически. При работе компьютера в реальном

режиме для активизации управления электропитанием необходим вызов обработчика прерывания INT 15\AX=5301h.

При вызове:

 

AX

= 5301h

BX

= 0000h (идентификатор APM-расширения системы BIOS).

При неудаче флаг CF установлен, в AH – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.

Примечание 1: обработчик прерывания INT 15\AX=5301h заставляет систему APM эмулировать спецификации APM версии 1.0. Если нужно вызывать операции, не определенные в версии 1.0, то их следует заранее разблокировать с помощью INT 15\AX=530Eh (8.01-72).

8.01-71 INT 15\AX=5307h – переключение режимов электропитания.

Программное выключение наиболее распространенных компьютеров конструктивного исполнения ATX выполняется путем перевода их блока электропитания в дежурный режим. При этом электропитание продолжает подаваться только на те узлы, которые обеспечивают возможность автоматического включения компьютера. Разумеется, программное выключение невозможно без аппаратной поддержки со стороны блока электропитания и материнской платы.

При вызове:

 

 

AX

= 5307h

 

BX

= 0001h

(идентификатор всех APM-управляемых устройств)

CX

= 0003h

(код запроса программного выключения)

При неудаче флаг CF установлен, в AH – код завершения (A.06-1),

– 369 –

Глава 8: Вызовы обработчиков прерываний

а при удачном завершении все остальное не имеет значения.

Примечание 1: операция выключения определена в спецификации APM версии 1.2.

Если система управления электропитанием эмулирует операции версии 1.0 (примечание 1 к 8.01-70), то возможность программного

выключения электропитания необходимо сначала разблокировать с помощью INT 15\AX=530Eh (8.01-72).

Примечание 2: в устаревших компьютерах конструктивного исполнения AT вызов данной операции допустим, но игнорируется.

8.01-72 INT 15\AX=530Eh – запрос версии управления электропитанием.

Чтобы обеспечить совместимость с имеющимися операционными системами, в спецификации управления электропитанием (APM) заложена возможность эмуляции более новыми версиями APM BIOS тех совокупностей операций, которые были способны исполнять старые версии APM. Программа, которой предстоит управлять электропитанием, должна заранее запросить у APM BIOS эмуляцию желаемой версии APM, а потом принять к исполнению возвращаемое APM BIOS сообщение о том, какую ближайшую версию APM данная APM BIOS способна

воспроизвести.

 

При вызове:

 

AX

= 530Eh

BX

= 0000h (идентификатор APM-расширения системы BIOS)

CX

– версия APM, эмуляция которой запрашивается (примечание 1)

При возврате:

при неудаче флаг CF установлен, в AH – код завершения (A.06-1), если флаг CF сброшен, то в AX – версия APM, которой будет

соответствовать предоставляемое множество операций.

Примечание 1: в регистре CX целую и дробную части номера версии APM надо записывать в разные байты. В частности, для запроса версии 1.2 надо указать CX=0102h. В таком же формате APM BIOS возвратит номер фактически эмулируемой версии в регистре AX.

Примечание 2: данная операция определена начиная со спецификации APM версии 1.1. Если возвращен код завершения AH=80h или AH=86h, а вызов INT 15\AX=5301h (8.01-70) завершился как-либо иначе, значит, BIOS данного компьютера реализует только APM версии 1.0.

8.01-73 INT 15\AH=83h,86h – управление счетом времени в таймере BIOS

При вызове:

AX = 8300h – запустить счет и отметить его окончание изменением состояния маркерного байта (примечание 3)

– 370 –

Глава 8: Вызовы обработчиков прерываний

AX

= 8600h

– запустить счет и остановить вызывающий процесс

 

до окончания счета

CX

– старшие 16 бит 32-битовой задержки в микросекундах

DX

– младшие 16 бит 32-битовой задержки в микросекундах

ES:BX– указатель на маркерный байт (только для AX = 8300h)

При возврате:

 

 

флаг CF сброшен при успешном завершении

флаг CF установлен при ошибке или запуске, когда счет уже идет

AH

– код завершения из таблицы A.06-1.

Примечание 1: вероятный шаг счета времени – 977 микросекунд.

Примечание 2: чтобы прервать уже начатый счет, надо вызвать INT 15\AH=8301h. Примечание 3: обычно маркерный байт – это байт 0040:00A0h (A.12-1). Некоторые системы BIOS по завершении счета устанавливают в единицу его

старший бит, другие записывают в маркерный байт число 80h. Примечание 4: из "окна DOS" системы Windows таймер BIOS недоступен.

8.01-74

INT 15\AH=84h – считывание состояния джойстика.

При вызове:

 

 

 

AH

= 84h

 

 

DX

= 0000h

– считать состояния переключателей

 

 

= 0001h

– считать сигналы положения манипуляторов

При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1). Если после исполнения подфункции DX=0000h флаг CF сброшен, то состояния

 

переключателей возвращаются в битах 4 – 7 регистра AL.

Если после исполнения подфункции DX=0001h флаг CF сброшен, то

AX

– значение x-координаты 1-го манипулятора

BX

– значение y-координаты 1-го манипулятора

CX

– значение x-координаты 2-го манипулятора

DX

– значение y-координаты 2-го манипулятора

Примечание 1: при типичном сопротивлении датчиков 250 кОм возвращаемые значения координат обычно находятся в пределах 0000h – 01A0h.

Примечание 2: если игровой порт в компьютере отсутствует, то подфункция DX=0001h возвращает нулевые значения координат, а подфункция DX=0000h возвращает AL=00h, что соответствует разомкнутому состоянию переключателей.

– 371 –

Глава 8: Вызовы обработчиков прерываний

8.01-75 INT 15\AH=85h – вызов по нажатию клавиши SysRq

Когда пользователь нажимает клавишу SysRq, обработчик прерывания INT 09 вызывает INT 15\AH=85h. Для INT 15\AH=85h обработчик прерывания должен быть поставлен драйвером видеокарты с тем, чтобы обеспечить распечатку выводимого на экран изображения в том формате, в котором работает видеокарта. Но если этот обработчик не поставлен, то сработает "заглушка", которая заранее ставится системой BIOS: она просто возвратит управление вызывающей программе так, как если бы вызов был удовлетворен.

При вызове:

 

 

AH

= 85h

 

AL

= 00h

– вызов при нажатии на клавишу SysRq

 

= 01h

– вызов при отпускании клавиши SysRq

флаг CF при вызове должен быть сброшен Если вызов удовлетворен, то флаг CF сброшен и AH = 00h.

При неудаче флаг CF установлен, в AH – код завершения (A.06-1).

8.01-76 INT 15\AH=87h – копирование с доступом в расширенную память

Обработчик прерывания INT 15\AH=87h осуществляет копирование блоков данных размером до 64 кбайт в пределах линейно адресуемой памяти до 16 Мбайт.

Копирование осуществляется в защищенном режиме при блокированных аппаратных прерываниях, так что готовить таблицу прерываний перед вызовом INT 15\AH=87h не нужно. Тем не менее для копирования посредством INT 15\AH=87h нужно заранее подготовить таблицу GDT из шести дескрипторов согласно показанному здесь шаблону:

Резервируемый дескриптор:

00

00

00

00

00

00

00

00

Резервируемый дескриптор:

00

00

00

00

00

00

00

00

Дескриптор сегмента-источника:

ss ss aa aa aa

93

00 00

Дескриптор сегмента назначения:

ss ss dd dd dd

93

00 00

Резервируемый дескриптор:

00

00

00

00

00

00

00

00

Резервируемый дескриптор:

00

00

00

00

00

00

00

00

В показанном шаблоне знаком "a" отмечено поле линейного адреса сегмента источника, знаком "d" – поле линейного адреса сегмента назначения, а знаком "s" – поля размера сегментов. Поскольку размер копируемого участка памяти задается в регистре CX количеством копируемых двухбайтовых слов, постольку размеры сегментов, выражаемые в байтах, должны быть не меньше, чем (2•CX)–1. И в полях размеров, и в полях адресов первыми следуют младшие байты, а последними

– старшие. Байты атрибутов и в дескрипторе-источнике, и в дескрипторе

– 372 –

Глава 8: Вызовы обработчиков прерываний

назначения должны быть равны 93h. Более детальные пояснения структуры дескрипторов даны в приложении A.12-2.

Резервируемые дескрипторы, заполненные нулями, обработчик прерывания INT 15\AH=87h задействует потом для обслуживания операций защищенного режима. По завершении копирования процессор будет переведен обратно в реальный режим, и будет восстановлено состояние, обеспечивающее продолжение исполнения вызывающей программы.

При вызове:

 

AH

= 87h

CX

– число копируемых слов, не более 7FFFh

ES:SI – указатель на подготовленную таблицу GDT.

При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.

Примечание 1: из-за исполнения копирования при блокированных аппаратных прерываниях пользование INT 15\AH=87h может привести к пропуску вызовов от внешних устройств. Копирование с доступом в расширенную память посредством драйвера HIMEM.SYS (A.12-4) этим недостатком не обладает.

Примечание 2: драйвер HIMEM.SYS перехватывает прерывание INT 15\AH=87h и не дает прикладным программам доступ к обработчику, который установлен системой BIOS. Тем не менее драйвер HIMEM.SYS позволит пользоваться прерыванием INT 15\AH=87h для доступа к ограниченному участку расширенной памяти, если этот участок зарезервирован заранее указанием параметра /INT15 (5.04-01).

8.01-77

INT 15\AH=88h – размер расширенной памяти до 16 Мбайт

При вызове:

 

 

AH

= 88h

При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1).

Если флаг CF сброшен, то миссия завершена успешно, и тогда

 

AX

– размер памяти в килобайтах, имеющейся за пределом 100000h,

 

 

то есть сверх 1 Мегабайта.

Примечание 1: если адресное пространство сверх 1 Мегабайта не является непрерывным, то будет показан размер до первого промежутка.

Примечание 2: обработчик прерывания INT 15\AH=88h считывает сведения о размере памяти из байтов 30h и 31h CMOS-памяти системы BIOS.

Примечание 3: вызовы обработчика прерывания INT 15\AH=88h, устанавливаемого системой BIOS, перехватываются драйверами HIMEM.SYS и EMM386.EXE.

– 373 –

Глава 8: Вызовы обработчиков прерываний

Примечание 4: для выяснения размера памяти сверх 16 Мбайт следует использовать INT 15\AX=E801h\E881h (8.01-79) или INT 15\AX=E820h (8.01-80).

8.01-78 INT 15\AH=89h – переключение процессора в защищенный режим.

Обработчик прерывания INT 15\AH=89h осуществляет процесс перехода в защищенный режим, включая операции занесения селекторов сегментов в

сегментные регистры и перепрограммирования контроллеров прерываний для работы с таблицей прерываний защищенного режима.

Чтобы исполнение вызывающей программы продолжилось после переключения процессора в защищенный режим, нужно заранее подготовить глобальную таблицу дескрипторов (GDT) и таблицу прерываний (IDT) для защищенного режима. Таблица IDT заполняется 8-байтовыми дескрипторами адресов перехода ("вентилями") для вызова обработчиков прерываний защищенного режима. Размер и линейный адрес расположения таблицы IDT записываются в дескриптор сегмента IDT, входящий в состав таблицы GDT.

Таблица GDT, подготавливаемая для обработчика прерывания INT 15\AH=89h, включает восемь 8-байтовых сегментных дескрипторов, причем их расположение должно соответствовать следующему шаблону:

Резервируемый дескриптор: Дескриптор сегмента GDT: Дескриптор сегмента IDT:

Дескриптор сегмента DS: Дескриптор сегмента ES: Дескриптор сегмента SS: Дескриптор сегмента CS:

Резервируемый дескриптор:

00 00 00 00 00 00 00 00

3F 00 aa aa aa 00 00 00 FF 03 aa aa aa F2 00 00 ss ss aa aa aa 92 0s aa ss ss aa aa aa 92 0s aa ss ss aa aa aa 92 0s aa ss ss aa aa aa 9A 0s 00 00 00 00 00 00 00 00 00

В показанном шаблоне знаком "a" отмечены поля линейного адреса каждого сегмента, а знаком "s" – поля размера сегментов. Резервируемые дескрипторы заполняют нулями. В качестве примера в шаблоне показаны конкретные значения байта атрибутов, а также размера для сегментов GDT и IDT. Детальная расшифровка структуры дескрипторов приведена в приложении A.12-2.

При вызове:

 

AH

= 89h

BL

– номер прерывания для IRQ 0 (примечание 2)

BH

– номер прерывания для IRQ 8 (примечание 2)

ES:SI – указатель на заполненную таблицу GDT

При неудаче флаг CF установлен, в AH – код завершения (A.06-1).

– 374 –

Глава 8: Вызовы обработчиков прерываний

При успешном переходе в защищенный режим флаг CF сброшен, AH = 00h, в

сегментные регистры процессора занесены селекторы сегментов из таблицы GDT. Значение в регистре BP может быть изменено.

Примечание 1: чтобы после перехода в защищенный режим исполнение программы продолжилось со следующей команды, дескриптор сегмента CS в составе таблицы GDT должен указывать на тот же сегмент, который определен сегментным адресом в регистре CS при реальном режиме.

Примечание 2: назначаемые номера прерываний в регистрах BL и BH должны быть кратны 8 (младшие 3 бита обнулены). Запросам по линиям IRQ 1 – IRQ 7 будут назначены следующие 7 номеров прерываний вслед за номером в регистре BL, а запросам по линиям IRQ 9 – IRQ F – следующие 7 номеров вслед за номером в регистре BH. При назначении номеров нужно учитывать, что номера до 1Fh могут быть задействованы исключениями, вызываемыми процессором.

Примечание 3: вследствие перепрограммирования контроллеров прерываний и

изменения формата адресации после перехода в защищенный режим становится невозможен прямой вызов всех обработчиков прерываний, предназначенных для использования в реальном режиме.

8.01-79

INT 15\AX=E801h,E881h – размер расширенной памяти.

При вызове:

 

 

AX

= E801h или E881h

При неудачном завершении флаг CF установлен. Если флаг CF сброшен, то

 

AX

– размер расширенной памяти в области между 1 Мбайт и 16

 

 

Мбайт (в килобайтах)

 

BX

– размер расширенной памяти в области сверх 16 Мбайт (в

 

 

64-килобайтных блоках)

 

CX

– размер конфигурированной памяти в области между 1 Мбайт и

 

 

16 Мбайт (в килобайтах)

 

DX

– размер конфигурированной памяти в области сверх 16 Мбайт

 

 

(в 64-килобайтных блоках)

Примечание 1: если при удачном завершении AX = BX = 0000h, то полный размер расширенной памяти следует считывать из регистров CX и DX.

Примечание 2: вызов INT 15\AX=E881h, в отличие от INT 15\AX=E801h,

правильно отображает величины свыше 4 Гбайт, выводя старшие значащие цифры в разрядах 16 – 31 32-разрядных регистров EBX и EDX. Способ доступа к ним из программ реального режима показан в разделе 7.02-06.

– 375 –

Глава 8: Вызовы обработчиков прерываний

Примечание 3: функции INT 15\AX=E801h\E881h не поддерживаются устаревшими версиями BIOS, разработанными до 1995 года.

8.01-80 INT 15\AX=E820h – карта распределения оперативной памяти.

Карта распределения представляет собой последовательность 20-байтных дескрипторов, каждый из которых описывает одну из областей памяти, выделенную с определенной целью системой BIOS. Каждый дескриптор начинается с 8-байтового стартового адреса, далее следует 8-байтовая длина соответствующей области памяти, и кончается дескриптор 4-байтовым кодом назначения области памяти (примечание 1). За один вызов считывается один дескриптор, так что INT 15\AX=E820h приходится вызывать несколько раз. Первый вызов требует установления в регистре EBX нулевого (00000000h) адреса считывания карты памяти, а возвращает ненулевое значение, необходимое для следующего вызова.

Окончание цикла вызовов отмечается либо возвратом нулевого значения в регистре EBX, либо установлением флага CF.

При вызове:

AX = E820h

EBX – адрес считывания карты памяти

ECX – размер буфера для дескриптора, не менее 20 байт

EDX = 534D4150h – сигнатура "SMAP"

ES:DI – указатель на буфер для записи дескриптора

При неудачном завершении значение в EAX отлично от сигнатуры 534D4150h, флаг CF установлен, в AH – код завершения (A.06-1).

При успешном завершении EAX = 534D4150h "SMAP", и тогда: EBX – следующий адрес считывания карты памяти ECX – фактическая длина записанных в буфер данных ES:DI – указатель на заполненный буфер

Примечание 1: определены следующие коды назначения областей памяти: 01h – память, предоставляемая операционной системе; 02h – память, резервированная BIOS (системная ROM);

03h – области таблиц ACPI (после считывания свободные); 04h – области энергонезависимой системной памяти ACPI.

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

Примечание 2: некоторые системы BIOS требуют, чтобы при вызове старшие разряды 16 – 31 регистра EAX были обнулены (EAX = 0000E820h).

– 376 –

Глава 8: Вызовы обработчиков прерываний

Способ доступа к EAX и другим 32-разрядным регистрам из программ реального режима показан в разделе 7.02-06.

Примечание 3: некоторые системы BIOS игнорируют значение в регистре ECX и всегда возвращают 20 байт данных.

Примечание 4: если вызов INT 15\AX=E820h компьютером не поддерживается, то рекомендуется попытаться вызвать INT 15\AX=E801h (8.01-79), а в случае повторной неудачи – INT 15\AH=88h (8.01-77).

8.01-81 INT 16\AH=03h – темп и задержка повторения для клавиатуры

При вызове:

 

 

AX

= 0300h

– установить значения, принимаемые по умолчанию

 

= 0305h

– установить темп из BL, задержку из BH

 

= 0306h

– вывести действующие значения темпа и задержки

BL

– (для AX=0305h): код темпа повторения (примечание 1)

BH

– (для AX=0305h): код задержки (примечание 2)

При возврате:

 

 

BL

– код установленного темпа повторения (примечание 1)

BH

– код установленной задержки (примечание 2)

AH

– содержимое может быть не сохранено

Примечание 1: допустимые значения кода темпа от 00h до 1Fh соответствуют темпам повторения от 30 раз в секунду до 2 раз в секунду.

Примечание 2: допустимые значения кода задержки от 00h до 03h соответствуют значениям задержки от 0.25 секунды до 1 секунды.

8.01-82 INT 16\AH=05h – введение кода нажатия клавиши в буфер клавиатуры

При вызове:

 

AH

= 05h

CH

– скэн-код нажатия клавиши из таблицы A.02-1

CL

– код ASCII соответствующего знака из таблицы A.02-1

При возврате:

 

AL

– код завершения из таблицы A.06-1

AH

– содержимое может быть не сохранено

Примечание 1: старые версии BIOS не поддерживают эту функцию.

Примечание 2: введение некоторых кодов (например, кода клавиши Enter) в буфер

клавиатуры может вызвать исполнение соответствующих функций Примечание 3: с помощью INT 16\AH=05h нельзя вводить коды "функциональных"

клавишей (Shift, Ctrl, Alt и т.п.).

– 377 –

Глава 8: Вызовы обработчиков прерываний

8.01-83 INT 16\AH=10h – получение кода клавиши из буфера клавиатуры

Обработчик прерывания INT 16\AH=10h обслуживает наиболее распространенные модели 101\108-клавишных клавиатур, а также совместимые клавиши на других клавиатурах. Он изымает коды клавиши из буфера клавиатуры и записывает их в регистры AH и AL, причем ожидает нажатия любой клавиши, если буфер клавиатуры в момент вызова пуст.

При вызове:

 

AH

= 10h

При возврате:

 

AH

– скэн-код клавиши из таблицы A.02-1

AL

– код ASCII соответствующего знака из таблицы A.02-1

Примечание 1: обработчик прерывания INT 16\AH=20h делает то же самое плюс реагирует на дополнительные клавиши, которые имеются только на редко используемых 122-клавишных клавиатурах.

Примечание 2: в очень старых компьютерах с 84\86-клавишными клавиатурами

для исполнения той же функции необходимо вызывать

INT 16\AH=00h. В более "свежих" компьютерах INT 16\AH=00h

действует так же и не реагирует на те клавиши, которых в старых клавиатурах нет.

8.01-84 INT 16\AH=11h – определение кода клавиши в буфере клавиатуры

Обработчик вызовов INT 16\AH=11h обслуживает наиболее распространенные модели 101\108-клавишных клавиатур, а также совместимые клавиши на других клавиатурах. Он не удаляет коды клавишей из буфера клавиатуры, а копирует их в регистры AH и AL, и не ждет нажатия клавиши, когда буфер пуст.

При вызове:

 

AH

= 11h

При возврате:

 

если флаг ZF установлен, то буфер клавиатуры пуст.

если флаг ZF сброшен, то

AH

– скэн-код из таблицы A.02-1

AL

– код ASCII из таблицы A.02-1

Примечание 1: обработчик прерывания INT 16\AH=21h делает то же самое плюс реагирует на дополнительные клавиши, которые имеются только на редко используемых 122-клавишных клавиатурах.

Примечание 2: в старых компьютерах с 84\86-клавишными клавиатурами для исполнения той же функции необходимо вызывать INT 16\AH=01h.

– 378 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]