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

         

Область памяти HMA


Область памяти от FFFFh:0010h (конец первого мегабайта) до FFFFh:FFFFh (конец адресного пространства в реальном режиме), 65 520 байт, может использоваться на компьютерах, начиная с 80286. Доступ к этой области осуществляется с помощью спецификации XMS, причем вся она выделяется целиком одной программе. Обычно, если загружен драйвер HIMEM.SYS и если в файле CONFIG.SYS присутствует строка DOS = HIGH, DOS занимает эту область, освобождая почти 64 Кб в основной памяти. При этом DOS может оставить небольшой участок HMA (16 Кб или меньше) для пользовательских программ, которые обращаются к нему с помощью недокументированной функции мультиплексора 4Ah.

INT 2Fh, AX= 4A01h — Определить размер доступной части HMA (DOS 5.0+)

Ввод: АХ = 4A01h
Вывод: ВХ = размер доступной части HMA в байтах, 0000h, если DOS не в HMA
ES:DI = адрес начала доступной части НМА (FFFFh:FFFFh, если DOS не в НМА)

INT 2Fh, АХ= 4A02h — Выделить часть НМА (DOS 5.0+)



Ввод: АХ = 4А02h
ВХ = размер в байтах
Вывод: ES:DI = адрес начала выделенного блока
ВХ = размер выделенного блока в байтах

В версиях DOS 5.0 и 6.0 нет функций освобождения выделенных таким образом блоков НМА. В DOS 7.0 (Windows 95) выделение памяти в НМА было организовано аналогично выделению памяти в обычной памяти и UMB, с функциями изменения размера и освобождения блока.

INT 2Fh, АХ = 4A03h — Управление распределением памяти в НМА (DOS 7.0+)

Ввод: АХ = 4A03h
DL = 0 — выделить блок (ВХ = размер в байтах)
DL = 1 — изменить размер блока (ES:DI = адрес, ВХ = размер)
DL = 2 — освободить блок (ES:DI = адрес)
СХ = сегментный адрес владельца блока
Вывод: DI = FFFFh, если не хватило памяти,
ES:DI = адрес блока (при выделении)

Следует помнить, что область НМА доступна для программ только в том случае, если адресная линия процессора А20 разблокирована. Если DOS не занимает НМА, она почти всегда заблокирована для совместимости с программами, написанными для процессора 8086/8088, которые считают, что адреса FFFFh:0010h — FFFFh:FFFFh всегда совпадают с 0000h:0000h — 0000h:FFEFh. Функции XMS 01 – 07 предоставляют возможность управления состоянием этой адресной линии.



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