файла в MS-DOS. Средства языков программирования и системы MS-DOS
предназначены для работы с этим типом файлов. Тип файлов .COM
первоначально был создан для совместимости с процессами операци-
онной системы CP/M, но этот тип не похож на вымирающий. Даже и
сегодня в версии MS-DOS файлы типа .COM являются упрощенной узкой
разновидностью файлов типа .EXE. С некоторой гибкостью файлы типа
.EXE заменяются назначаемым по умолчанию форматом.COM. В резуль-
тате такого упрощения файлы типа .COM загружаются гораздо быст-
рее, но различие скоростей тривиально для современных машин.
После образования процесса макроассемблер MASM не знает и не
заботится о том, чтобы знать, какой тип файла ассемблируется. Во
время компоновки компоновщик LINK обнаружит, что файлы формата
.COM не имеют стекового сегмента, но при этом компоновщик не бу-
дет выражать свое неудовольствие. Вот, когда выполняется функция
- 3-24 -
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
_______________________________|________________|_______________
Блок начального распределения |Вся память |Размер может
| |быть изменен
_______________________________|________________|_______________
- 3-25 -
Загрузка файла типа .COM
Начальные шаги, предпринимаемые при загрузке и выполнении
программного файла типа .COM, идентичны шагам, предпринимаемым
при загрузке программного файла типа .EXE. При установке "кон-
текста" процесса MS-DOS сначала инициализирует блок среды, выби-
рая информацию либо из текущей среды системы (случай, принимаемый
по умолчанию), или из среды, указываемой порождающим процессом.
После установки среды, MS-DOS распределяет блок памяти для
программы. Для программ типа .COM этот блок памяти занимает всю
оставшуюся память. Минимально требуемый размер равен размеру фай-
ла программы типа.COM плюс память для PSP. После получения блока
памяти MS-DOS продолжает строить сегмент программого префикса
для программы в начале блока памяти. В этой точке используемый
процесс загрузки заметно отличается от того, который используется
с программой типа .EXE.
Файл типа .COM читается в память непосредственно выше PSP по
смещению 100 (шестнадцатиричное значение) в блоке памяти и без
настройки. Все регистры сегмента инициализируются для адреса сег-
мента PSP, указатель инструкции устанавливается в 100 (шестнадца-
тиричное значение), а указатель стека устанавливается в значение
0FFFE (шестнадцатиричное значение) или ниже, если имеется менее
64 Кбайт памяти, доступной процессу. (Минимальное значение указа-
теля стека равно 0100 - шестнадцатиричное значение). Управление
возвращается в процесс и программа .COM начинает выполнение.
Некоторые программы .COM имеют неприятности при функциониро-
вании из-за минимального стека, обеспечиваемого MS-DOS. Если
программа выполняется при слишком маленьком стеке, то в результа-
те это может привести к росту стека вниз в раздел программы или
данных, что непременно приведет к фатальному окончанию програм-
мы. Если программа .COM требует стек, больше минимального размера
в 256 байтов, то программист может построить свой минимальный
стек памяти в образе программы путем резервирования большего
пространства памяти в конце программы. (Запомните, что MS-DOS при
загрузке программы типа .COM автоматически добавит для стека не
менее 256 байт памяти). Этот способ при недостатке памяти для
требуемого стека не даст возможность MS-DOS загрузить программу.
Формат программного файла типа .EXE
В отличие от программного файла типа .COM, который содержит
только образ программы, файл программы типа .EXE должен содержать
всю необходимую информацию для настройки ссылок внутреннего сег-
мента. Также в связи с тем, что в программе типа .EXE не запре-
щено иметь свой особый стек или особую начальную точку, програм-
мный файл типа .EXE должен содержать информацию для загрузчика с
целью надлежащей инициализации программы.
Файл программы типа .EXE состоит из трех разделов: заголовка
файла .EXE, таблицы настройки и образа программы. Заголовок файла
.EXE показан в таблице 3-4. Некоторые элементы в заголовке обес-
печивают начальное состояние образа программы. Это: MinAlloc (ми-
нимальное распределение), MaxAlloc (максимальное распределение) и
начальные значения SS:SP и CS:IP. Другие элементы: настраиваемые
элементы и смещение таблицы настройки позволяют загрузчику обес-
печивать доступ к таблице настройки процесса.
Каждый элемент в таблице настройки позволяет загрузчику раз-
- 3-26 -
решать ссылку одного сегмента внутри образа программы. Каждый
элемент содержит указатель длины (сегмента или смещения) для
ссылки сегмента внутри образа загрузки. Указатель самого сегмента
является относительным по отношению к началу образа загрузки.
Таблица 3-4
Заголовок программного файла типа .EXE
________________________________________________________________
Шестнад-|
цатирич-|
ное сме-| Содержимое
щение |
_________|______________________________________________________
00 |Сигнатура. Маркер типа файла программы .EXE: 4D5H
|(шестнадцатиричное значение)
_________|______________________________________________________
02 |Остаток. Количество байтов на последней странице файла
|(размер образа загрузки модуля 512 байт)
_________|______________________________________________________
04 |Страницы. Количество 512-байтных страниц в файле,
|включая заголовок.
_________|______________________________________________________
06 |Элементы настройки. Количество элементов в таблице
|настройки.
_________|______________________________________________________
08 |Размер заголовка. Размер заголовка в 16-байтовых па-
|раграфах.
_________|______________________________________________________
0A |Минимальное распределение (MinAlloc). Минимальное ко-
|личество параграфов памяти, требуемое после конца
|программы.
_________|______________________________________________________
0C |Максимальное распределение (MaxAlloc). Максимальное
|количество параграфов памяти, требуемое после конца
|программы.
_________|______________________________________________________
0E |Стековый сегмент. Начальное значение для стекового
|сегмента (относительно начала образа загрузки програм-
|мы.
_________|______________________________________________________
10 |Указатель стека. Начальное значение указателя стека.
_________|______________________________________________________
12 |Контрольная сумма. Двоичное дополнение контрольной
|суммы программного файла.
_________|______________________________________________________
14 |Указатель инструкции. Начальное значение указателя
|инструкции.
_________|______________________________________________________
16 |Кодовый сегмент. Начальное значение кодового сегмента
|(относительно начала образа загрузки программы).
_________|______________________________________________________