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

         

Интерфейс EMS


Дополнительная память (EMS) — способ для программ, запускающихся в реальном режиме (или в режиме V86), обращаться к памяти, находящейся за пределами первого мегабайта. EMS позволяет отобразить сегмент памяти, начинающийся обычно с 0D000h, на любые участки памяти, аналогично тому, как осуществляется доступ к видеопамяти в SVGA-режимах. Вызывать функции EMS (прерывание 67h) можно, только если в системе присутствует драйвер с именем ЕММХХХХ0. Для проверки его существования можно, например, вызвать функцию 3Dh (открыть файл или устройство), причем на тот случай, если драйвер EMS отсутствует, а в текущей директории есть файл с именем ЕММХХХХ0, следует дополнительно вызвать функцию IOCTL — INT 21h с АХ = 4400h и ВХ = идентификатор файла или устройства, полученный от функции 3Dh. Если значение бита 7 в DX после вызова этой функции 1, то драйвер EMS наверняка присутствует в системе.

Основные функции EMS:

INT 67h, АН = 46h — Получить номер версии

Ввод: AH = 46h
Вывод: АН = 0 и AL = номер версии в упакованном BCD (40h для 4.0)



Во всех случаях, если АН не ноль, произошла ошибка.

INT 67h, АН = 41h — Получить сегментный адрес окна

Ввод: AH = 41h
Вывод: АН = 0 и ВХ = сегментный адрес окна

INT 67h, АН = 42h — Получить объем памяти

Ввод: AH = 42h
Вывод: АН = 0
DX = объем EMS-памяти в 16-килобайтных страницах
ВХ = объем свободной EMS-памяти в 16-килобайтных страницах

INT 67h, АН = 43h — Выделить идентификатор и EMS-память

Ввод: АН = 43h
ВХ = требуемое число 16-килобайтных страниц
Вывод: АН = 0, DX = идентификатор

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

INT 67h, АН = 44h — Отобразить память

Ввод: АН = 44h
AL = номер 16-килобайтной страницы в 64-килобайтном окне EMS (0 – 3)
ВХ = номер 16-килобайтной страницы в EMS-памяти
DX = идентификатор
Вывод: АН = 0
<
/p> Теперь запись/чтение в указанную страницу в реальном адресном пространстве приведет к записи/чтению в указанную страницу в EMS-памяти.

INT 67h, АН = 45h — Освободить идентификатор и EMS-память

Ввод: АН = 45h
DX = идентификатор
Вывод: АH = 00h
Спецификация EMS была разработана для компьютеров IBM XT, снабжавшихся специальной платой, на которой и находилась дополнительная память. С появлением процессора 80286 появилась возможность устанавливать больше одного мегабайта памяти на материнской плате и для работы с ней была введена новая спецификация — XMS. Тогда же появились менеджеры памяти, эмулировавшие EMS поверх XMS, для совместимости со старыми программами, причем работа через EMS оказывалась значительно медленнее. Позже, когда в процессорах Intel появился механизм страничной адресации, оказалось, что теперь уже EMS можно реализовать значительно быстрее XMS. Большинство программ для DOS, которым требуется дополнительная память, поддерживают обе спецификации.


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