4.9.1. Обычная память

До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там имеется еще хотя бы 64 Кб свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти - выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).

Функция DOS 48k Выделить память Вход:    АН = 48п

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

АХ = сегментный адрес выделенного блока CF = 1, если произошла ошибка:

АХ - 7 - блоки управления памятью разрушены

АХ = 8 - недостаточно памяти:

ВХ = размер максимального доступного блока

Эта функция с большим значением в ВХ (обычно OFFFFh) используется для определения размера самого большого доступного блока памяти.

Функция DOS     Освободить память

Вход:    АН = 49h

ES = сегментный адрес освобождаемого блока

Выход: CF = 0, если блок освобожден

CF    І, 7, если блоки управления памятью разрушены;

АХ = 9, если в ES содержится неверный адрес

Эта функция не позволит освободить блок памяти, которым текущая програм­ма не владеет, но с помощью функции DOS 50h (АХ = 50h, ВХ = сегментный ад­рес PSP процесса) программа может «притвориться» любым другим процессом.

Функция DOS     Изменить размер блока памяти

Вход:   AH = 4Ah

ВХ = новый размер в 16-байтных параграфах

ES - сегментный адрес модифицируемого блока Выход: CF = 1, если при выполнении операции произошла ошибка АХ   7, если блоки управления памятью разрушены

АХ = 8, если не хватает памяти (при увеличении)

АХ = 9, если ES содержит неверный адрес

ВХ = максимальный размер, доступный для этого блока

Если для увеличения блока не хватило памяти, DOS расширяет его до возмож­ного предела.

При запуске СОМ-программы загрузчик DOS выделяет самый большой до­ступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделен­ный программе блок памяти до минимума перед загрузкой другой программы),

но уже в MS DOS 5.0 и далее с помощью этих же функций можно выделять па­мять в областях UMB - неиспользуемых участках памяти выше 640 Кб и ниже І Мб, для чего требуется сначала подключить UMB к менеджеру памяти изме­нить стратегию выделения памяти с помощью функции DOS 58h.