Страница 14 из 20 Раздел 3. Управление программами. Большинство программ загружаются в память, запускаются, а затем удаляются операционной системой при завершении. Языки высо- кого уровня обычно не имеют альтернативы. Но для программистов на ассемблере имеется другая возможность и данный раздел демонстри- рует ее. Некоторые программы действуют как драйверы устройств или драйверы прерываний и они должны быть сохранены в памяти ("резидентными") даже после их завершения (вектора прерываний обеспечивают механизм, посредством которого последующие программы могут обращаться к резидентным процедурам). Иногда программе необходимо запустить из себя другую программу. На самом деле DOS позволяет программе загрузить в память вторую копию COMMAND.COM, которая может использована как средство интерфейса с пользовате- лем или выполнения команд типа COPY или DIR. Программы могут быть в двух форматах: .EXE или .COM. Программы первого типа могут быть больше 64K, но они требуют некоторой обработки перед тем, как DOS загрузит их в память. С другой сто- роны COM программы существуют прямо в том формате, который нужен для загрузки в память. COM программы особенно полезны для корот- ких утилит. В обоих случаях код, составляющий программу, предва- ряется в памяти префиксом программного сегмента (PSP). Это об- ласть размером 100H байт, которая содержит информацию необходимую DOS для работы программы; PSP также обеспечивает место для файло- вых операций ввода/вывода [5.3.5]. При загрузке EXE файла и DS и ES указывают на PSP. Для COM файлов CS также сначала указывает на PSP. Отметим, что MS DOS 3.0 имеет функцию, которая возвращает номер сегмента PSP. Это функция 62H прерывания 21H; ей ничего не надо подавать на входе, а в BX возвращается номер параграфа. Одна из причин, по которой интересно положение PSP, состоит в том, что его первое слово содержит номер прерывания DOS, которое будет приводить к завершению программы. Когда выполняется послед- ний оператор RET программы, то значения на вершине стека указы- вают счетчику команд (регистр IP) на начало PSP, таким образом код завершения выполняется как следующая инструкция программы. Дальнейшее обсуждение этого смотрите в пунктах [1.3.4] и [1.3.6]. Для справки приводим значение полей PSP: Смещение Размер поля Значение 0H DW номер функции DOS завершения программы 2H DW размер памяти в параграфах 4H DW резерв 6H DD длинный вызов функции диспатчера DOS AH DD адрес завершения (IP,CS) EH DD адрес выхода по Ctrl-Break (IP,CS) 12H DD адрес выхода по критической ошибке 16H 22 байта резерв 2CH DW номер параграфа строки среды 2EH 46 байтов резерв 5CH 16 байтов область параметров 1 (формат FCB) 6CH 20 байтов область параметров 2 (формат FCB) 80H 128 байтов область DTA по умолчанию/получает командную строку программы. |