"Роберт Джордайн. Справочное пособие программиста - 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 файлов это не так. |
|
|