Глава 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 Манипуляции с памятью.-~>

Сайт управляется системой uCoz