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

         

Управление памятью в DPMI


INT 31h, AX = 0100h — Выделить память ниже границы 1 Мб

Ввод: АХ = 0100h
ВХ = требуемый размер в 16-байтных параграфах
Вывод: если CF = 0,
АХ = сегментный адрес выделенного блока для использования в реальном режиме;
DX = селектор выделенного блока для применения в защищенном режиме

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

INT 31h, АХ = 0101h — Освободить память ниже границы 1 Мб

Ввод: АХ = 0101h
DX = селектор освобождаемого блока
Вывод: CF = 0, если не было ошибок

INT 31h, АХ = 0102h — Изменить размер блока, выделенного функцией 0100h

Ввод: АХ = 0102h
ВХ = новый размер блока в 16-байтных параграфах
DX = селектор модифицируемого блока
Вывод: CF = 0, если не было ошибок

INT 31h, АХ = 0500h — Получить информацию о свободной памяти

Ввод: АХ = 0500h
ES:EDI = адрес 48-байтного буфера
Вывод: CF = 0 всегда, буфер заполняется следующей структурой данных:

    +00h: 4 байта — максимальный доступный блок в байтах

    +04h: 4 байта — число доступных нефиксированных страниц

    +08h: 4 байта — число доступных фиксированных страниц

    +0Ch: 4 байта — линейный размер адресного пространства в страницах

    +10h: 4 байта — общее число нефиксированных страниц

    +14h: 4 байта — общее число свободных страниц

    +18h: 4 байта — общее число физических страниц

    +1Ch: 4 байта — свободное место в линейном адресном пространстве

    +20h: 4 байта — размер swap-файла или раздела в страницах

    +24h: 0Ch байт — все байты равны FFh

INT 31h, AX = 0501h — Выделить блок памяти

Ввод: АХ = 0501h
ВХ:СХ = размер блока в байтах, больше нуля
Вывод: если CF = 0,
ВХ:СХ = линейный адрес блока;
SI:DI = идентификатор блока для функций 0502 и 0503
<
/p> INT 31h, АХ = 0502h — Освободить блок памяти

Ввод: АХ = 0502h
SI:DI = идентификатор блока
Вывод: CF = 0, если не было ошибки
INT 31h, AX = 0503h — Изменить размер блока памяти

Ввод: АХ = 0503h
ВХ:СХ = новый размер в байтах
SI:DI = идентификатор блока
Вывод: если CF = 0,
ВХ:СХ = новый линейный адрес блока;
SI:DI = новый идентификатор
Нам потребуются еще две функции DPMI для работы с устройством, которое отображает свою память в физическое пространство адресов.

INT 31h, АХ = 0800h — Отобразить физический адрес выше границы 1 Мб на линейный

Ввод: АХ = 0800h
ВХ:СХ = физический адрес
SI:DI = размер области в байтах
Вывод: если CF = 0, ВХ:СХ = линейный адрес, который можно использовать для доступа к этой памяти
INT 31h, AX = 0801h — Отменить отображение, выполненное функцией 0800h

Ввод: АХ = 0801h
ВХ:СХ = линейный адрес, возвращенный функцией 0800h
Вывод: CF = 0, если не было ошибок

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