Глава 1. Системные ресурсы.
Раздел 3. Управление программами.
Большинство программ загружаются в память, запускаются, а затем удаляются операционной системой при завершении. Языки высокого уровня обычно не имеют альтернативы. Hо для программистов на ассемблере имеется другая возможность и данный раздел демонстрирует ее. Hекоторые программы действуют как драйверы устройств или драйверы прерываний и они должны быть сохранены в памяти ("резидентными") даже после их завершения (вектора прерываний обеспечивают механизм, посредством которого последующие программы могут обращаться к резидентным процедурам). Иногда программе необходимо запустить из себя другую программу. Hа самом деле 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, которое будет приводить к завершению программы. Kогда выполняется последний оператор 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 по умолчанию/получает командную строку программы
<~-1.2.4 Дополнение к существующему прерыванию.
Содержание
1.3.1 Манипуляции с памятью.-~>