Assembler - язык неограниченных возможностей

         

Функции DPMI управления дескрипторами


INT 31h, AX = 0 — Выделить локальные дескрипторы

Ввод: АХ = 0
СХ = количество необходимых дескрипторов
Вывод: если CF = 0, АХ = селектор для первого из заказанных дескрипторов

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

INT 31h, AX = 1 — Удалить локальный дескриптор



Ввод: АХ = 1
ВХ = селектор
Вывод: CF = 0, если не было ошибки

Эта функция действует на дескрипторы, созданные при переключении в защищенный режим, и на дескрипторы, созданные функцией 0, но не на дескрипторы, созданные функцией 2.

INT 31h, АХ = 2 — Преобразовать сегмент в дескриптор

Ввод: АХ = 2
ВХ = сегментный адрес (A000h — для видеопамяти, 0040h — для данных BIOS)
Вывод: если CF = 0, АХ = готовый селектор на сегмент, начинающийся с указанного адреса, и с лимитом 64 Кб

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

INT 31h, AX = 6 — Определить базу сегмента

Ввод: АХ = 6
ВХ = селектор
Вывод: если CF = 0, CX:DX = 32-битный линейный адрес начала сегмента

INT 31h, AX = 7 — Сменить базу сегмента

Ввод: АХ = 7
ВХ = селектор
CX:DX = 32-битная база
Вывод: CF = 0, если не было ошибок

INT 31h, AX = 8 — Сменить лимит сегмента

Ввод: АХ = 8
ВХ = селектор
CX:DX = 32-битный лимит (длина сегмента минус 1)
Вывод: CF = 0, если не было ошибок
(чтобы определить лимит сегмента, можно пользоваться командой LSL)

INT 31h, AX = 9 — Сменить права доступа сегмента

Ввод: АХ = 9
ВХ = селектор
CL = права доступа/тип (биты 15 – 8 слова 2 дескриптора)
СН = дополнительные права (биты 7 – 4 соответствуют битам 7 – 4 слова 3 дескриптора, биты 3 – 0 игнорируются)
Вывод: CF = 0, если не было ошибок
(чтобы определить права доступа сегмента, можно пользоваться командой LAR)
<
/p> INT 31h, АХ = 0Ah — Создать копию дескриптора

Ввод: АХ = 000Ah
ВХ = селектор (сегмента кода или данных)
Вывод: если CF = 0, АХ = селектор на сегмент данных с теми же базой и лимитом
INT 31h, AX = 0Bh — Прочитать дескриптор

Ввод: АХ = 000Bh
ВХ = селектор
ES:EDI = селектор:смещение 8-байтного буфера
Вывод: если CF = 0, в буфер помещен дескриптор
INT 31h, AX = 0Ch — Загрузить дескриптор

Ввод: АХ = 000Ch
ВХ = селектор
ES:EDI = адрес 8-байтного дескриптора
Вывод: CF = 0, если не было ошибок
INT 31h, AX = 0Dh — Выделить определенный дескриптор

Ввод: АХ = 000Dh
ВХ = селектор на один из первых 16 дескрипторов (значения селектора 04h – 7Ch)
Вывод: CF = 0, если нет ошибок (CF = 1 и АХ = 8011h, если этот дескриптор занят)
Этого набора функций, а точнее пары функций 00 и 0Ch, достаточно для того, чтобы полностью настроить режим flat (или любой другой) после переключения в защищенный режим. Но прежде чем это осуществить, нам надо познакомиться с тем, как в DMPI сделан вызов обработчиков прерываний реального режима, иначе наша программа просто не сможет себя проявить.


Содержание раздела