6.3.1. Переключение в защищенный режим

Все основные сервисы DPMI доступны только в защищенном режиме через прерывание INT 31h, следовательно, переключение режимов - первое, что долж­на сделать программа.

Ш2¥ЬАХ=* 1687h: Функция DPMI: получить точку входа в защищенный режим Вход:  АХ= 1687h

Выход: АХ = 0, если DPMI присутствует

ВХ: бит 0 = 1, если поддерживаются 32-битные программы; 0, если нет

CL: тип процессора (02 - 80286, 03 - 80386 и т. д.)

DH:DL - версия DPMI в двоичном виде (обычно 00:90 (00:5Ah) или

01:00)

SI = размер временной области данных, требуемой для переключения в 16-байтных параграфах

ES:DI = адрес процедуры переключения в защищенный режим

Вызвав эту функцию, программа должна выделить область памяти размером SIX 16 байт и выполнить дальний CALL на указанный адрес. Единственные вход­ные параметры - регистр ES, который содержит сегментный адрес области дан­ных для DPMI и бит 0 регистра АХ. Если этот бит 1 - программа собирается стать 32-битным приложением, а если 0 - 16-битным. Если по возвращении из проце­дуры установлен флаг CF, переключения не произошло и программа все еще в ре­альном режиме. Если CF = 0, программа переключилась в защищенный режим и в сегментные регистры загружены следующие селекторы:

CS: 16-битный селектор с базой, совпадающей со ' старым CS, и лимитом 64 Кб DS: селектор с базой, совпадающей со старым DS, и лимитом 64 Кбшштт

SS: селектор с базой, совпадающей со старым SS, и лимитом 64 Кб

ES: селектор с базой, совпадающей с началом блока PSP, и лимитом 100h

FS и GS - О

Разрядность сегментов данных определяется заявленной разрядностью про­граммы. Остальные регистры сохраняются, а для 32-битных программ старшее слово ESP обнуляется. По адресу ES:[QQ2Ch] записывается селектор сегмента, содержащего переменные окружения DOS.

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

Перечислим теперь основные функции, предоставляемые DPMI для работы с дескрипторами и селекторами.