До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там есть еще хотя бы 64 килобайта свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти — выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).
Функция DOS 48h — Выделить память
Ввод: | АН = 48h ВХ = размер блока в 16-байтных параграфах |
Вывод: | CF = 0, если блок выделен АХ = сегментный адрес выделенного блока CF = 1, если произошла ошибка:
АХ = 8 — недостаточно памяти:
|
Эта функция с большим значением в ВХ (обычно FFFFh) используется для определения размера самого большого доступного блока памяти.
Функция DOS 49h — Освободить память
Ввод: | АН = 49h ES = сегментный адрес освобождаемого блока |
Вывод: | CF = 0, если блок освобожден CF = 1:
АХ = 9, если в ES содержится неверный адрес |
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.
Функция DOS 4Ah — Изменить размер блока памяти
Ввод: | АН = 4Ah ВХ = новый размер в 16-байтных параграфах ES = сегментный адрес модифицируемого блока |
Вывод: | CF = 0, если размер блока изменен CF = 1: АХ = 7, если блоки управления памятью разрушены, ВХ = максимальный размер, доступный для этого блока |
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела.
При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS-DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB — неиспользуемых участках памяти выше 640 Кб и ниже 1 Мб, для этого требуется сначала подключить UMB к менеджеру памяти и изменить стратегию выделения памяти с помощью функции DOS 58h.