Префикс программного сегмента

МS DOS отводит префиксу сегмента программы область в 256 байт в начале блока памяти, выделяемого транзитной программе. Префикс имеет несколько связей с МS DOS, которые могут использоваться транзитной программой; кроме того, определенную информацию записывает в него МS DOS как для собственных целей, так и для передачи транзитной программе, которая в случае необходимости может информацию использовать.

В префиксе по относительному адресу 0000Н находится команда передачи управления системному обработчику завершения процесса, который удаляет программу после ее выполнения и осуществляет окончательный выход. По относительному адресу 0005Н находится команда связи с диспетчером функций МS DOS, который осуществляет дисковые операции, операции ввода-вывода через консоль и другое сервисное обслуживание по запросу транзитной программы.

В слове префикса с относительным адресом 0002Н находится сегментный адрес верхней границы блока памяти, выделенного транзитной программе. Программа может с помощью этого значения определить, следует ли запросить больше памяти для своей работы и имеется ли лишняя память, которую можно освободить для нужд других процессов.

Область префикса с адреса 000АН по адрес 0015Н предназначена для предыдущего содержимого векторов прерываний обработчиков завершения Ctrl-С и критической ошибки. Если транзитная программа изменит эти векторы для своих целей, то после ее завершения система DOS восстановит исходные значения векторов, сохраненные в префиксе. Слово префикса с относительным адресом 002СН хранит сегментный адрес блока окружения, в котором находится несколько АSCIIZ-строк (последовательности символов в коде АSCII, заканчивающиеся нулевым байтом). Блок окружения наследуется от программы, которая вызывала функцию ЕХЕС для загрузки выполняющейся в данный момент программы. В блоке находится такая информация, как текущий путь, используемый программами файла СОММАND.СОМ для поиска выполнимых программ, расположение на диске самого файла СОММАND.СОМ, формат запроса пользователя, который выдается СОММАND.СОМ. Хвост команды - это остаток командной строки (после имени программы), запустившей транзитную программу; хвост команды копируется в префикс, начиная с относительного адреса 0081Н. Длина хвоста команды, без учета символа возврата в конце строки, помещается в байт с относительным адресом 0080Н. Параметры перенаправления или конвейеризации и связанные с ними имена файлов не встречаются в той части командной строки (хвосте команды), которая передается транзитной программе, так как операция переназначения прозрачна для прикладных программ.

Область префикса длиной 128 байт от 0080Н до 00FFН, устанавливаемая системой МS DOS до передачи управления транзитной программе, служит также стандартной дисковой областью пересылки (disk transfer area, DTA). Если программа явным образом не изменяет DТА, то все операции чтения или записи файла, затребованные вызовами группы функций типа FСВ (file control bloc - блок управления файлами), автоматически используют эту область в качестве буфера данных.

Программы типа .COM

Программы типа .СОМ хранятся на диске в виде файлов, в которых содержится абсолютный образ машинных команд, предназначенных для выполнения. Так как файлы не содержат никакой настроечной информации, то они компактнее эквивалентных файлов типа .ЕХЕ, к тому же загружаются для выполнения немного быстрее. Заметим, что DOS не пытается выяснить, действительно ли файл типа .СОМ содержит выполнимую программу (здесь в отличие от файла типа .ЕХЕ нет признака, ни контрольной суммы). Система заносит любой файл с расширением .СОМ в память и передает ему управление.

Так как программы типа .СОМ загружаются непосредственно над префиксом сегмента программы и, кроме того, не имеют заголовка, который может задавать другую точку входа, то их начальный адрес всегда составляет 0100H, что определено размером префикса. Максимальная длина программы типа .СОМ составляет 65536 байт минус длина префикса (256 байт) и обязательное слово стека (2 байта).

Когда управление передается программе типа .СОМ, все регистры указывают на префикс. В указатель стека SР, если позволяет память, помещается число 0FFFFН, в противном случае - максимальный адрес памяти минус 2 байта. (DOS при входе в программу помещает в стек нулевое слово.)

Несмотря на то что размер выполнимого файла типа .СОМ не может превзойти 64 К, существующие в настоящее время версии системы МS DOS выделяют программам типа .СОМ в момент их загрузки всю область транзитных программ. Так как такие программы часто являются наследием раннего периода МS-DOS и необязательно корректны в отношений управления памятью, то операционная система делает наихудшее предположение и дает программам типа .СОМ все, что возможно. Если программа типа .СОМ хочет использовать для возбуждения другого процесса функцию ЕХЕС, то сначала она должна сократить выделяемую ей память до минимума, обеспечивающего продолжение ее работы, обращая внимание при этом на сохранение стека программы. Когда программа типа .СОМ завершает выполнение, она возвращает управление операционной системе с помощью системного прерывания Int 21Н с функцией 4СН.

Прикладная программа типа .СОМ может компоноваться из многих отдельных объектных модулей. Все модули должны использовать одно и то же имя сегмента программы и имя класса, причем модуль с точкой входа по относительному адресу 0100Н внутри сегмента при компоновке должен быть первым. Кроме того, внутри программы типа .СОМ все процедуры должны иметь атрибут NEAR (ближний), так как вся выполнимая программа постоянно находится в одном сегменте.

В процессе компоновки программы типа .СОМ компоновщик выдает на экран дисплея сообщение:

Warning: no stack segment (Предупреждение: нет сегмента стека)

Это сообщение можно игнорировать. Результатом работы, компоновщика является файл типа .ЕХЕ, который до выполнения должен быть преобразован с помощью системной утилиты EXE2BIN в файл типа .СОМ.