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