|
|
|
|
Файлы процессов MS-DOS: .EXE в сравнении с .COM
Как известно, в MS-DOS файлы исполнимой программы могут быть в двух вариантах: файлы типа .COM и файлы типа .EXE. Рисунки 2-3 (в главе 2) и 3-6
иллюстрируют некоторые различия между этими двумя типами файлов. Для MS-DOS различия проявляются в других формах.
Тип файла .EXE - это в действительности "естественный" режим файла в MS-DOS. Средства языков программирования и системы MS-DOS предназначены для
работы с этим типом файлов. Тип файлов .COM первоначально был создан для совместимости с процессами операционной системы CP/M, но этот тип не похож
на вымирающий. Даже и сегодня в версии MS-DOS файлы типа .COM являются упрощенной узкой разновидностью файлов типа .EXE. С некоторой гибкостью файлы
типа .EXE заменяются назначаемым по умолчанию форматом.COM. В результате такого упрощения файлы типа .COM загружаются гораздо быстрее, но различие
скоростей тривиально для современных машин.
После образования процесса макроассемблер MASM не знает и не заботится о том, чтобы знать, какой тип файла ассемблируется. Во время компоновки
компоновщик LINK обнаружит, что файлы формата .COM не имеют стекового сегмента, но при этом компоновщик не будет выражать свое неудовольствие. Вот,
когда выполняется функция EXE2BIN для преобразования файлов типа .EXE в файлы типа .COM, различия в файлах начинают обнаруживаться.
Все объектные файлы, вырабатываемые макроассемблером MASM, и файлы типа .EXE, создаваемые компоновщиком LINK, могут содержать настраиваемые
(переместимые) ссылки сегмента. Эти файлы содержат таблицы, которые включают списки, где в программе делаются явные ссылки на программу или кодовый
сегмент по его адресу. В связи с тем, что адрес сегмента в программе будет зависеть от того, где он загружен в памяти, когда загружается программа
.EXE, MS-DOS должна каким-либо образом обновить ячейки в программе, где делается ссылка этого сегмента, изменяя значения для указания на текущий
сегмент. Этот процесс называется relocating (настройкой). Перед рассмотрением выполнения настройки посмотрим чем этот процесс отличается от загрузки
файлов типа .COM.
Когда EXE2BIN выполняет преобразование файла типа .EXE в файл типа .COM, она просматривает файл типа .EXE для нахождения этих ссылок на сегменты.
Если она находит явную ссылку на сегмент в программе, или неявную ссылку на другой не базовый сегмент, она вырабатывает сообщение об ошибке, указывающее
на то, что файл не может быть преобразован. Кроме этого, EXE2BIN выполняет проверку того, чтобы программа начиналась с адреса 100h относительно
базового сегмента. Если все эти условия удовлетворяются, то EXE2BIN удаляет из файла всю настраиваемую информацию и вырабатывает файл типа .COM. Различия
между этими двумя форматами программ кратко излагаются в таблице 3-3.
Таблица 3-3
Различия между форматами .COM и .EXE
________________________________________________________________
| |
Атрибуты | тип .COM | тип .EXE
_______________________________|________________|_______________
Количество допустимых сегментов|Только 1 |Несколько сег-
| |ментов
_______________________________|________________|_______________
Ссылка на сегменты |Нет |Ссылки допуска-
| |ются
_______________________________|________________|_______________
Стековый сегмент |Не указывается |Должен быть оп-
| |ределен
_______________________________|________________|_______________
Начало программного кода |ORG в 100h |ORG не требует-
| |ся
_______________________________|________________|_______________
Размер программы |Менее 64 кбайт |Может быть лю-
| |бого размера
_______________________________|________________|_______________
Адрес PSP находится |Во всех регист- |В регистрах ES
|рах |и DS
_______________________________|________________|_______________
Блок начального распределения |Вся память |Размер может
| |быть изменен
_______________________________|________________|_______________
|
|
|