Исполняемый файл COM-формата

Данный формат исполняемого файла является самым старым. Если считать началом

«нашей эры» конец 70-х годов, когда появились компьютеры на базе

микропроцессора i8086, то основы формата COM появились еще «до нашей эры».

В то время были популярны компьютеры на базе 8-разрядных микропроцессоров

i8080 (отечественный аналог — КР580ВМ80). Одной из отличительных

характеристик этих микропроцессоров была поддержка размера оперативной памяти

не более 64 Кбайт. Таким образом, размер программы, выполняющейся на

компьютере с микропроцессором i8080, изначально был ограничен его архитектурой.

А с учетом того, что некоторая часть оперативной памяти отводилась для программ

операционной системы, — реальный размер программы был еще меньше. COM-

формат поддерживался операционной системой CP/M фирмы Digital Research и

показал свою эффективность. С появлением 16-разрядного микропроцессора фирмы

Intel i8086/88, возникла необходимость в операционной системе, которая в полной

мере использовала бы его возможности. Фирма Microsoft разработала операционную

систему MS-DOS. Большинство программ в то далекое время имело небольшой

размер, и фирма Microsoft, не изобретая заново велосипед, ввела поддержку COM-

формата в операционную систему MS-DOS. На уроке 10 мы уже обсуждали данный

формат исполняемого файла. При этом отмечалось, что исходный файл должен

удовлетворять определенным требованиям. Поэтому мы не будем повторять то, что

уже было сказано, а проникнем немного вглубь вопроса. Для этого в качестве

примера рассмотрим исходный текст программы, оформленный в соответствии с

требованиями COM-формата

MZ-формат был разработан фирмой Microsoft для поддержки многосег-

ментных программ в среде MS-DOS. С точки зрения структуры, файл MZ-формата

имеет три части:

􀂁 заголовок;

􀂁 таблицу размещения;

􀂁 программный код.

Заголовок состоит из полей фиксированного размера

NE-формат (New Executeable code file) исполняемого файла был разработан для

операционной системы Windows 2.0. Этот же формат использовался в операционной

системе OS/2 фирмы IBM. Исполняемый файл NE-формата состоит из двух

исполняемых файлов:

􀂁 исполняемый файл MZ-формата;

􀂁 исполняемый файл NE-формата.

Если посмотреть на пример дампа исполняемого файла NE-формата (рис. 4), то

видно, что первые несколько десятков байт являются не чем иным, как только что

рассмотренным нами файлом MZ-форматa (MS-DOS). В его задачу входит вывод

сообщения типа «This program required Microsoft Windows». Наверняка оно вам

известно, как и та ситуация, при которой это сообщение выводится. Загрузчик

Windows знает об этой особенности загрузочного файла и сразу начинает работать со

второй его частью. Загрузчик MS-DOS впрямую запускает программу с расширением

.exe на исполнение. Данная маленькая программа добросовестно исполняется,

выводя вышеуказанное (или подобное ему) сообщение, и благополучно завершается.

В принципе, вместо этой маленькой программы может быть полноценная программа,

представляющая собой DOS-версию приложения.

Определить тот факт, что исполняемый файл с расширением .exe является файлом

формата NE, достаточно просто. Для этого достаточно посмотреть на значение в

байте со смещением 18h от начала файла. Если там значение 40h, то перед вами не

MZ-формат. Далее необходимо посмотреть на содержимое слова со смещением 3Сh.

Значение в нем показывает смещение заголовка NE исполняемого файла

относительно начала файла. Общий формат исполняемого файла NE-формата

показан на рис. 3. Фрагменты дампа файла NE-формата показаны на рис. 4. В начале

файла расположена программа-заглушка MS-DOS. Формат этой части файла NE-

формата показан в табл.

Исполняемый файл PE-формата

(Windows NT 3.5/95/98)

Для 32-разрядных операционных систем фирма Microsoft разработала специальный

формат исполняемого файла. Он получил название переносимый формат

исполняемого файла (PE — Portable Executable). В нашем изложении мы будем

называть его PE-форматом. Детальное рассмотрение PE-формата требует очень

много места, но вряд ли это так необходимо. В большинстве случаев достаточно

представлять общую структуру файла PE-формата («знать, что где лежит»). Для

получения детальной информации всегда можно обратиться к документации.

Необходимо отметить, что идеи, заложенные в PE-формат, не новы. Основы этого

формата были заложены в операционной системе UNIX, где аналогичный формат

назывался COFF-формат (Common Object File Format — стандартный формат

объектного файла). Почему формат файла в 32-разрядных операционных системах

назван переносимым (portable)? Это сделано из-за стремления фирмы Microsoft

создать единый формат исполняемого файла для реализаций операционной системы

Windows NT на различных аппаратных платформах (что, конечно, не означает

совместимости на уровне машинных команд).

Перечислим особенности данного формата:

􀂁 простота загрузки файла PE-формата. Если сравнивать этот процесс с загрузкой

файла NE-формата, то для PE-исполняемого файла он значительно проще. Чтобы

загрузить NE-файл, загрузчик должен создать рабочие структуры в памяти, найти

информацию для их заполнения внутри NE-файла;

􀂁 поддержка сплошной модели памяти. Конструкция PE-файла максимально

упрощена с точки зрения загрузки в память. Фактически он представляет собой

слепок участка оперативной памяти;

􀂁 не требуется настраивать сегменты команд или данных, так как их нет в том виде,

как это было в 16-разрядной среде;

􀂁 расположение многих полей в PE-файле задается с помощью относительного

смещения от начала PE-файла — Относительного Адреса Поля (ОАП). Сам PE-

файл располагается по Базовому Адресу Памяти (БАП) — физическому адресу

памяти, с которого начинается загруженный в память модуль.

Информация в PE-файле является, в основном, высокоуровневой и используется

системой или u1087 приложениями, чтобы определить правила обращения с конкретным

исполняемым файлом.

Наши рекомендации