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

         

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


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

Функция DOS 48h — Выделить память

Ввод: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Вывод: CF = 0, если блок выделен
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка:
    АХ = 7 — блоки управления памятью разрушены
    АХ = 8 — недостаточно памяти:
    ВХ = размер максимального доступного блока

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



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

Ввод: АН = 49h
ES = сегментный адрес освобождаемого блока
Вывод: CF = 0, если блок освобожден
CF = 1:
    АХ = 7, если блоки управления памятью разрушены,
    АХ = 9, если в ES содержится неверный адрес

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

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

Ввод: АН = 4Ah
ВХ = новый размер в 16-байтных параграфах
ES = сегментный адрес модифицируемого блока
Вывод: CF = 0, если размер блока изменен
CF = 1:

    АХ = 7, если блоки управления памятью разрушены,
    АХ = 8, если не хватает памяти (при увеличении),
    АХ = 9, если ES содержит неверный адрес

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

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

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



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