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

Dos7book

.pdf
Скачиваний:
75
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

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

AX

минимальное значение X-координаты (по горизонтали)

BX

минимальное значение Y-координаты (по вертикали)

CX

максимальное значение X-координаты (по горизонтали)

DX

максимальное значение Y-координаты (по вертикали)

Примечание 1: когда доступная курсору площадь экрана не ограничена "окном", тогда предпочтительно пользоваться INT 33\AX=0026h (8.03-51).

Примечание 2: прежде чем определять пределы изменения координат, нужно с помощью INT 33\AX=0032h (8.03-55) выяснить, поддерживает ли установленный драйвер "мыши" функцию INT 33\AX=0031h.

8.03-55 INT 33\AX=0032h – доступные функции драйвера "мыши"

При вызове:

AX = 0032h

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

AX – слово, в котором установление в единицу каждого бита свидетельствует о поддержке одной из функций драйвера:

бит 3: – поддерживается INT 33\AX=0031h

бит 10: – поддерживается INT 33\AX=002Ah бит 11: – поддерживается INT 33\AX=0029h бит 12: – поддерживается INT 33\AX=0028h бит 14: – поддерживается INT 33\AX=0026h

содержимое регистров BX, CX, DX может быть изменено.

8.03-56 INT 4A – вызов обработчика ежедневного действия

Устанавливаемый по умолчанию обработчик прерывания INT 4A просто возвращает управление вызывающей программе. В роли вызывающей программы выступает система BIOS, которая с определенной периодичностью вызывает INT 4A, если время вызова задано с помощью INT 1A\AH=06h (8.01-94). Посредством перехвата INT 4A другим, специально установленным обработчиком можно организовать исполнение определенных действий в заданное время.

Примечание 1: при написании альтернативного обработчика прерывания INT 4A следует учитывать нереентерабельность DOS и принимать соответствующие меры в случае необходимости (8.02-70, 8.02-87).

– 459 –

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

8.03-57 INT 67\AH=41h – получение сегментного адреса кадра страниц

Драйвер EMM386.EXE (5.04-02) по умолчанию организует 4 страницы доступа к расширенной памяти, сгруппированные в один 64-килобайтный кадр. Обычно этот кадр располагается начиная с сегментного адреса E000h.

При вызове:

 

AH

= 41h

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

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

BX

начальный сегментный адрес кадра страниц.

Примечание 1: перед обращением к INT 67\AH=41h нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67, загружен и активизирован.

8.03-58 INT 67\AH=42h – получение числа страниц расширенной памяти

Разметке на 16-килобайтные страницы EMS-памяти подлежит адресное пространство от 1088 до 32768 кбайт, за исключением участков, которые резервированы (параметром /L, 5.04-02) для доступа посредством XMS-драйвера

(5.04-01).

При вызове:

 

AH

= 42h

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

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

BX

число свободных страниц расширенной памяти

DX

полное число страниц расширенной памяти.

Примечание 1: перед обращением к INT 67\AH=42h нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67, загружен и активизирован.

8.03-59 INT 67\AH=43h – выделение расширенной памяти и номерной ссылки

В отличие от INT 21\AH=3Dh (8.02-33), драйвер EMM386.EXE (5.04-02)

выделяет и обслуживает ссылки, относящиеся только к участкам расширенной памяти. Каждый такой участок содержит целое число 16-килобайтных (логических) страниц. Для идентификации отдельной страницы расширенной памяти необходимо указывать номерную ссылку и, кроме того, номер логической страницы

впределах относящегося к данной ссылке участка.

460 –

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

При вызове:

 

 

 

 

 

 

 

AH

= 43h

 

 

 

 

 

BX

запрашиваемое (ненулевое) число логических страниц

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

расширенной памяти, по 16 кбайт каждая.

 

 

 

 

 

 

 

 

 

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

DX

номерная ссылка на выделенный участок расширенной памяти.

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

обращением

к

INT 67\AH=43h

нужно

с

помощью

 

INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что

 

драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67,

 

загружен и активизирован.

 

 

 

 

Примечание 2: драйвер

EMM386.EXE по умолчанию выделяет

до

64 ссылок.

 

Параметром "h" (5.04-02) этот предел может быть увеличен до 255.

Примечание 3: согласно стандарту

LIM

EMS 4.0 та же

операция может быть

 

выполнена посредством вызова INT 67\AX=5A00h. Спецификации

 

вызова (кроме AX=5A00h) такие же,

но INT 67\AX=5A00h

 

допускает запрос нулевого количества логических страниц.

8.03-60 INT 67\AH=44h – отображение логической страницы на физическую

Здесь под отображением подразумевается установление такого соответствия, при котором любое обращение к 16-килобайтной (физической) странице в пределах до 1 мегабайта автоматически переадресуется к другой (логической) странице в адресном пространстве за пределами 1 мегабайта.

При вызове:

 

AH

= 44h

AL

номер физической страницы для отображения;

BX

номер логической страницы, которую надо отобразить, или

 

=FFFFh – для высвобождения указанной физической страницы;

DX

номерная ссылка, к которой относится логическая страница.

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

 

AH

код завершения (A.06-1); при успешном завершении AH = 00h.

Примечание 1: перед обращением к INT 67\AH=44h нужно с помощью

 

INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что

 

драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67,

загружен и активизирован.

Примечание 2: счет страниц (и физических, и логических) начинается с нуля. Примечание 3: физические страницы 00h – 03h входят в состав кадра,

расположение которого показывает INT 67\AH=41h (8.03-57). Расположение физических страниц с номерами 04h и выше следует

– 461 –

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

определять посредством INT 67\AX=5800h (8.03-70). Если

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

8.03-61 INT 67\AH=45h – аннулирование ссылки и высвобождение памяти

Когда номерная ссылка и соответствующий ей участок расширенной памяти становятся больше не нужны, тогда программа, которой эта ссылка выделена, должна сообщить об этом драйверу EMM386.EXE (5.04-02), чтобы данный участок расширенной памяти стал считаться свободным.

При вызове:

 

AH

= 45h

DX

номерная ссылка, которую надо аннулировать

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

 

AH

код завершения (A.06-1); при успешном завершении AH = 00h.

Примечание 1: аннулировать с помощью INT 67\AH=45h можно только те ссылки, которые были выделены драйвером EMM386.EXE (5.04-02)

 

 

посредством

INT 67\AH=43h

(8.03-59) или

INT 67\AX=5A00h.

 

 

Другие

номерные

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

 

 

INT 21\AH=68h, INT 21\AH=6Ah или INT 21\AH=3Eh (8.02-34).

Примечание 2: доступ

к

тем

страницам

расширенной

памяти, которые

 

 

соответствовали аннулированной ссылке, нельзя возобновить

 

 

посредством повторного запроса ссылки.

 

8.03-62

INT 67\AH=46h – выяснение версии драйвера EMS- памяти

При вызове:

 

 

 

 

 

 

 

AH

= 46h

 

 

 

 

 

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

 

 

 

 

 

 

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

 

AL

номер версии действующего драйвера EMM386.EXE (5.04-02).

Примечание 1: способ обнаружить факт загрузки драйвера EMM386.EXE состоит в

считывании двухбайтового сегментного адреса обработчика прерывания INT 67 из ячейки 0000:019Eh и в проверке наличия имени драйвера (EMMXXXX0) в поле имени, начинающемся со смещения 000Ah относительно считанного сегментного адреса. До подтверждения факта загрузки драйвера EMM386.EXE ни одну из функций INT 67 вызывать нельзя, так как адрес в указанной ячейке

– 462 –

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

может быть недействителен (например, 0000h). Когда факт загрузки драйвера EMM386.EXE подтвержден, тогда возврат значения AH = 00h обработчиком прерывания INT 67\AH=46h будет свидетельствовать о том, что драйвер EMM386.EXE находится в активном, действующем состоянии.

Примечание 2: если факт загрузки драйвера EMM386.EXE подтвержден, и при этом обработчик прерывания INT 67\AH=46h возвращает в регистре AH ненулевой код завершения, значит, драйвер EMM386.EXE находится в неактивном состоянии. В таком случае с помощью

INT 67\AX=FFA5h (8.03-74) можно найти адрес API драйвера

EMM386.EXE, и, обратившись по этому адресу, перевести драйвер в активное состояние.

8.03-63 INT 67\AH=4Bh – число ссылок для доступа к расширенной памяти

При вызове:

 

 

 

 

 

 

AH

= 4Bh

 

 

 

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

 

 

 

 

 

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

 

BX

число ссылок, задействованных драйвером EMM386.EXE.

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

обращением к

INT 67\AH=4Bh нужно

с

помощью

 

 

INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что

 

 

драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67,

 

 

загружен и активизирован.

 

 

Примечание 2: драйвер

EMM386.EXE

по умолчанию выделяет

до

64 ссылок.

 

 

Параметром "h" (5.04-02) этот предел может быть увеличен до 255.

8.03-64

INT 67\AH=4Ch – число логических страниц номерной ссылки

При вызове:

 

 

 

 

 

 

AH

= 4Ch

 

 

 

 

DX

номерная ссылка на участок расширенной памяти

 

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

 

 

 

 

 

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

 

BX

число логических страниц в участке расширенной памяти,

 

 

относящемся к указанной номерной ссылке.

 

 

Примечание 1: вызов INT 67\AH=4Ch обслуживает только те номерные ссылки, которые выданы посредством INT 67\AH=43h (8.03-59) драйвером

EMM386.EXE (5.04-02). Перед обращением к INT 67\AH=4Ch

нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62)

– 463 –

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

убедиться в том, что драйвер EMM386.EXE загружен и активизирован.

8.03-65 INT 67\AH=4Eh – сохранение состояния расширенной памяти.

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

Чтобы после завершения миссии резидентного модуля исполнение прерванной программы можно было бы продолжить, исходное отображение страниц расширенной памяти нужно восстановить. Для этого предусмотрены 4 подфункции прерывания INT 67\AH=4Eh, позволяющие выяснить размер блока памяти для записи состояния, осуществить запись данных об отображении страниц в этот блок памяти, а впоследствии восстановить исходное отображение страниц по записанным заранее данным.

При вызове:

 

 

AH

= 4Eh

AL

подфункция:

 

= 00h – сохранение данных о текущем состоянии

 

= 01h

восстановление прежнего состояния по записи

 

= 02h

последовательное исполнение подфункций 00h и 01h

 

= 03h

определение размера блока памяти для записи

ES:DI – адрес для записи данных (только для подфункций 00h и 02h) DS:SI – адрес блока данных (только для подфункций 01h и 02h)

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

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

AL

размер блока данных в байтах (только после подфункции 03h)

Примечание 1: вызов INT 67\AH=4Eh обслуживается драйвером расширенной памяти EMM386.EXE (5.04-02) версии не ниже 4.00, так что сначала следует с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE загружен, активизирован, и что его версия соответствует требуемой.

Примечание 2: начиная с версии 3.00 драйвера EMM386.EXE сохранение и

восстановление состояния отображения расширенной памяти возможны с помощью функций INT 67\AH=47h и INT 67\AH=48h соответственно. Эти функции сохраняют данные в памяти, выделенной драйверу EMM386.EXE (отдельный блок данных не нужен), сохраняют состояние только одного 64-килобайтного кадра страниц и требуют указания в регистре DX номерной ссылки, предоставленной драйвером EMM386.EXE запрашивающему резидентному модулю.

– 464 –

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

8.03-66 INT 67\AX=5000h – соответствие логических и физических страниц

Посредством прерывания INT 67\AX=5000h драйвер EMM386.EXE (5.04-02)

принимает новую таблицу соответствия логических и физических страниц, относящихся к одной номерной ссылке. Один вызов INT 67\AX=5000h эквивалентен нескольким последовательным вызовам INT 67\AH=44h (8.03-60).

При вызове:

 

AX

= 5000h

CX

число записей в таблице соответствия (примечание 3)

DX

номерная ссылка

DS:SI – указатель на начало таблицы соответствия

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

 

AH

код завершения (A.06-1); при успешном завершении AH = 00h.

Примечание 1: вызов INT 67\AH=5000h обслуживает только те номерные ссылки, которые выданы посредством INT 67\AH=43h (8.03-59) драйвером

EMM386.EXE. Перед обращением к INT 67\AH=5000h нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE (5.04-02) загружен и активизирован.

Примечание 2: если запрашиваемая физическая страница размещается ниже границы 640 кбайт, то соответствующее ей пространство памяти

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

Примечание 3: каждая запись в таблице соответствия занимает 4 байта и состоит из двух слов, из которых второе это номер физической страницы (обычно 0000h – 0003h). Для операции установления соответствия (mapping) первым словом в записи должен быть номер логической страницы. Для операции разрыва соответствия (unmapping) в первом слове записи нужно указывать значение FFFFh.

Примечание 4: функция INT 67\AX=5001h делает то же самое и принимает те же спецификации, за исключением того, что вторым словом в каждой

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

8.03-67 INT 67\AH=51h – изменение числа выделенных логических страниц

При вызове:

 

AH

= 51h

BX

требуемое полное число логических страниц

DX

номерная ссылка

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

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

– 465 –

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

BX – новое полное число страниц, доступных по данной ссылке.

Примечание 1: вызов INT 67\AH=51h обслуживает только те номерные ссылки, которые выданы посредством INT 67\AH=43h (8.03-59) драйвером

EMM386.EXE. Перед обращением к INT 67\AH=51h нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE (5.04-02) загружен и активизирован.

Примечание 2: требуемое число страниц может быть больше или меньше числа тех, которые уже доступны по данной ссылке. Номера добавляемых логических страниц будут следовать за номерами тех, которые были доступны раньше. Если же вызов INT 67\AH=51h уменьшает задействованное число страниц, то высвобождение памяти будет происходить начиная со страниц с наибольшим номером.

8.03-68 INT 67\AH=55h-56hпереход и вызов подпрограммы в EMS-памяти

При исполнении операций дальней передачи управления (JMP FAR и CALL FAR) в расширенной памяти доступ к логической странице назначения необходимо подготавливать заранее. В связи с этим драйвер EMM386.EXE предоставляет две функции, сочетающие дальнюю передачу управления с заменой таблицы соответствия логических и физических страниц для одной номерной ссылки. Функция INT 67\AH=55h заменяет таблицу соответствия и выполняет дальний переход (JMP FAR), а функция INT 67\AH=56h заменяет таблицу соответствия и выполняет дальний вызов подпрограммы (CALL FAR). Параметры перехода и

вызова передаются обработчику прерывания в составе заранее подготовленного блока данных, показанного в приложении A.12-6.

При вызове:

 

 

AX

= 5500h

для осуществления дальнего перехода

 

= 5600h

для осуществления дальнего вызова подпрограммы

DX

номерная ссылка, выданная драйвером EMM386.EXE

DS:SI – указатель на блок данных A.12-6.

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

 

 

AH

код завершения (A.06-1); при успешном завершении AH = 00h.

Примечание 1: пользоваться операциями INT 67\AH=55h-56h могут только те программы, которые реально исполняются в расширенной памяти.

Примечание 2: операции INT 67\AX=5501h и INT 67\AX=5601h также исполняют переход и вызов подпрограммы, но отличаются тем, что принимают в составе таблиц соответствия не номера физических страниц, а их сегментные адреса.

Примечание 3: операция INT 67\AX=5602h не требует никаких других исходных сведений (кроме AX) и возвращает в регистре BX число байтов,

– 466 –

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

которое займут адреса возврата, сохраняемые в стеке операциями вызова подпрограммы (INT 67\AX=5600h-5601h).

8.03-69 INT 67\AX=5700h-5701hкопирование данных или обмен данными

Операции INT 67\AX=5700h-5701h копируют данные или выполняют обмен данных между участками памяти, доступными через разные номерные ссылки и находящимися как в расширенной, так и в обыкновенной памяти. Вся адресация осуществляется через дескриптор, показанный в таблице A.12-5.

При вызове:

 

 

AX

= 5700h

копирование данных из одного участка в другой

 

= 5701h

обмен данными между участками памяти

DS:SI – указатель на дескриптор, показанный в таблице A.12-5

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

 

 

AH

код завершения (A.06-1); при успешном завершении AH = 00h.

Примечание 1: вызовы INT 67\AH=57h обслуживают только те номерные ссылки, которые выданы посредством INT 67\AH=43h (8.03-59) драйвером

EMM386.EXE. Перед обращением к INT 67\AH=57h нужно с помощью INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что драйвер EMM386.EXE (5.04-02) загружен и активизирован.

8.03-70

INT 67\AX=5800h – сегментные адреса физических страниц

При вызове:

 

 

AX

= 5800h

 

ES:DI – указатель на буфер для данных

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

 

 

AH

код завершения из таблицы A.06-1; если AH = 00h, то

 

CX

число записей в буфере (по 4 байта каждая);

ES:DI – указатель на заполненный буфер (примечание 2)

 

 

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

обращением к

INT 67\AH=58h

нужно

с

помощью

INT 67\AH=46h (примечание 1 к 8.03-62) убедиться в том, что

драйвер EMM386.EXE (5.04-02), обслуживающий вызовы INT 67,

загружен и активизирован.

 

 

 

 

Примечание 2: каждая

запись в

буфере

состоит из двух слов: первое слово

сегментный адрес физической страницы, а второе номер этой

физической страницы.

 

 

 

 

Примечание 3: число физических

страниц и, следовательно, требуемый размер

буфера,

могут

быть

определены

заранее

с

помощью

INT 67\AX=5801h, которое точно так же возвращает число записей

– 467 –

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

в регистре CX, но не заполняет буфер данными и игнорирует содержимое ES:DI.

8.03-71 INT 67\AX=DE06h – определение физического адреса страницы.

Данная служебная функция VCPI-серверов дает возможность составить представление о том, как механизм страничной переадресации в 32-разрядных процессорах преобразует адресное пространство в области UMB после установления защищенного режима работы процессора. Поскольку роль сервера

VCPI в MS-DOS7 играет драйвер EMM386.EXE (5.04-02), постольку перед обращением к INT 67\AX=DE06h нужно убедиться, что драйвер EMM386.EXE загружен и активизирован (примечание 1 к 8.03-62), а также что обслуживание функций VCPI не запрещено параметром /noVCPI (5.04-02).

При вызове:

 

AX

= DE06h

CX

номер страницы в пределах до 1 Мегабайта (примечание 1)

Успешное завершение отмечается значением AH = 00h, и тогда

EDX – физический адрес запрошенной страницы (примечание 2). Неудача отмечается ненулевым кодом завершения в AH, причем

AH = 8Bh обычно означает ошибку в указании номера страницы.

Примечание 1: в отличие от функций LIM EMS, функции VCPI оперируют страницами памяти размером 4 кбайт теми же, с которыми работает механизм страничной переадресации в 32-разрядных процессорах. Поэтому здесь номер страницы это ее линейный адрес, сдвинутый вправо на 12 бит. Например, ячейке памяти D400:1ABCh будет соответствовать линейный адрес D5ABCh и, следовательно, номер страницы CX=00D5.

Примечание 2: способ доступа к EDX и другим 32-разрядным регистрам из программ DOS показан в разделе 7.02-06.

8.03-72 INT 67\AX=DE07h – считывание из управляющего регистра CR0.

В отличие от операции считывания состояния регистра CR0 командой MOV (примечание 1 к 7.03-58), данная служебная функция VCPI-серверов действует в защищенном режиме на третьем уровне привилегий. Поскольку роль сервера VCPI в MS-DOS7 играет драйвер EMM386.EXE (5.04-02), постольку перед обращением к INT 67\AX=DE07h нужно убедиться, что драйвер EMM386.EXE загружен и активизирован (примечание 1 к 8.03-62), а также что обслуживание функций VCPI не запрещено параметром /noVCPI (5.04-02).

При вызове:

– 468 –

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