"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автора

на, то устанавливается флаг переноса, а в AX возвращается код
ошибки, объясняющий причину. Возможны три кода ошибки:

7 разрушен управляющий блок памяти
8 недостаточно памяти для выполнения функции
9 неверный адрес блока памяти

Функция отведения блока использует коды 7 и 8, а освобождения - 7
и 9, в то время как функция изменения блока использует все три
кода. В следующем примере сначала отводится блок, размером 1024
байта. При этом BX содержит требуемое число 16-байтных парагра-
фов, а при завершении стартовый адрес блока равен AX:0 (т.е.
смещение 0 в сегменте со значением, содержащимся в AX). Вторая
часть примера освобождает этот же блок, как и требуется при за-
вершении программы. В данном случае значение полученное в AX
помещается в ES. DOS следит за размером блока и знает какое коли-
чество параграфов надо освободить.

;---отведение блока размером 1024 байта
MOV AH,48H ;номер функции
MOV BX,64 ;требуем 64 параграфа
INT 21H ;пытаемся отвести блок
JC ERROR ;обрабатываем ошибку в случае неудачи
MOV BLOCK_SEG,AX ;иначе сохраняем адрес блока
.
;---освобождаем тот же блок
MOV AX,BLOCK_SEG ;получаем стартовый адрес блока
MOV ES,AX ;помещаем его в ES
MOV AH,49H ;номер требуемой функции
INT 21H ;освобождаем блок памяти

Наконец, приведем пример использования функции 4AH. ES содер-
жит значение сегмента PSP, т.е. самого первого байта памяти, с
которого загружена программа. Это значение присваивается ES при
старте задачи. Для использования SETBLOCK надо либо вызывать эту
функцию в самом начале программы (прежде чем ES будет изменен),
либо сохранить его начальное значение для последующего использо-
вания.
BX содержит требуемый размер блока в 16-байтных параграфах.
Для определения этого размера поместите добавочный "искуственный"
сегмент в конец программы. В макроасссемблере IBM PC сегменты
располагаются в алфавитном порядке, поэтому Вы можете поместить
его в любое место программы, при условии, что его имя это что-то
вроде "ZSEG". В других ассемблерах действительно помещайте фик-
тивный сегмент в конец программы. Программа может прочитать пози-
цию этого сегмента и, сравнивая ее со стартовым сегментом, полу-
чить количество памяти, требуемое самой программе. В момент заг-
рузки программы и ES и DS содержат номер параграфа самого начала
программы в префиксе программного сегмента; для COM файлов CS
также указывает на эту позицию, но для EXE файлов это не так.