EXE

Материал из Википедии — свободной энциклопедии
Перейти к навигацииПерейти к поиску
Исполняемый файл DOS MZ
Расширение..exe
MIME-типapplication/vnd.microsoft.portable-executable
СигнатураMZ или ZM
РазработчикMicrosoft
Тип форматадвоичный,исполняемый,объектный,динамическая библиотека
Расширен из.COM
Развит вNew Executable
Linear Executable
Portable Executable

.EXE (сокр.англ. executable — исполняемый) —расширениеисполняемых файлов, применяемое в операционных системахDOS,Windows,Symbian OS,OS/2 и в некоторых других, соответствующее рядуформатов. Кромеобъектного кода может содержать различныеметаданные (ресурсы,цифровая подпись[1]).

Содержание

Форматы .EXE

[править |править код]
  • MZ — 16-битный формат, основной формат файлов .EXE вDOS.
    • EXE-файлы дляWindows иOS/2 используют другие форматы для основной частипрограммы, но всё равно начинаются с заглушки в формате MZ, которая, как правило, при попытке запустить файл вDOS выводит сообщениеThis program cannot be run in DOS mode. («Эту программу невозможно запустить в режиме DOS») и завершает выполнение, хотя теоретически может запускать некий произвольный код, работоспособный в DOS.
  • NE — 16-битный формат, использовался вWindows 3.x[2], OS/2 иMS-DOS.
  • LE — смешанный 16- и 32-битный формат, ранее использовался в OS/2 и Windows (VxD).
  • LX — 32-битный формат, используется в OS/2.
  • PE — 32- и 64-битный формат, используется в современных версиях Windows, начиная сWindows NT иWindows 95.

Структура файлов

[править |править код]

Файл EXE, создаваемыйкомпоновщиком, состоит из двух частей:

  • управляющая информация для загрузчика;
  • загрузочный модуль.

Информация для загрузчика, описанная ниже, расположена в начале файла и образует так называемыйзаголовок. Сразу за ним следует тело загрузочного модуля, представляющее собой копию образа памяти задачи, построенной компоновщиком.

Стандартная часть заголовка имеет следующий формат[3]:

00-01 4D5A — сигнатура файла .EXE;
02-03 Длина образа задачи по модулю 512 (то есть число полезных байт в последнем блоке). Компоновщики версий до 1.10 помещали в это поле 04; если оно имеет такое значение, его рекомендуется игнорировать);
04-05 Длина файла в блоках;
06-07 Число элементов таблицы настройки адресов;
08-09 Длина заголовка в 16-байтных параграфах. Используется для выяснения начала тела загрузочного модуля;
0A-0B Минимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
0C-0D Максимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
0E-0F Сегментный адрес начала стекового сегмента относительно начала образа задачи;
10-11 Значение SP при входе в задачу;
12-13Контрольная сумма — ноль минус результат сложения без переноса всех слов файла;
14-15 ЗначениеIP (счетчика команд) при входе в задачу;
16-17 Сегментный адрес начала кодового сегмента относительно начала образа задачи;
18-19 Адрес первого элемента таблицы настройки адресов относительно начала файла;
1A-1B Номер сегмента перекрытий (0 для корневого сегмента программы).

Далее следует таблица настройки адресов. Таблица состоит из элементов, число которых записано в байтах 06-07. Элемент таблицы настройки состоит из двух полей: 2-байтного смещения и 2-байтного сегмента, и указывает слова в загрузочном модуле, содержащее адрес, который должен быть настроен на место памяти, в которое загружается задача.Настройка производится следующим образом:

  1. В области памяти после резидентной части выполняющей загрузку программы строитсяпрефикс программного сегмента (PSP);
  2. Стандартная часть заголовка считывается в память;
  3. Определяется длина тела загрузочного модуля (разность длины файла 04-07 и длины заголовка 08-09 плюс число байт в последнем блоке 02-03). В зависимости от признака, указывающего загружать задачу в конец памяти или в начало, определяется сегментный адрес для загрузки. Этот сегмент называетсяначальным сегментом;
  4. Загрузочный модуль считывается в начальный сегмент;
  5. Таблица настройки порциями считывается в рабочую память;
  6. Для каждого элемента таблицы настройки к полю сегмента прибавляется сегментный адрес начального сегмента. В результате элемент таблицы указывает на слово в памяти, к которому прибавляется сегментный адрес начального сегмента;
  7. Когда таблица настройки адресов обработана, в регистры SS и SP записываются значения, указанные в заголовке, а к SS прибавляется сегментный адрес начального сегмента. В ES и DS записывается сегментный адрес начала PSP. Управление передается по адресу, указанному в заголовке (байты 14-17).

Структура программного сегмента

[править |править код]
Информация должна бытьпроверяема, иначе она может быть удалена. Вы можетеотредактировать статью, добавив ссылки наавторитетные источники в видесносок.(26 мая 2014)

При обращении к нерезидентной команде или вызове программы операцией Exec,DOS определяет минимальный адрес, начиная с которого может быть загружена соответствующая программа. Эта область называется программным сегментом.

По смещению 0000 в программном сегментеDOS формируетпрефикс программного сегмента (PSP). Сама программа загружается по смещению 0100.

Программа завершается переходом по адресу 0000 в программном сегменте, выполнив INT 20, или выполнив INT 21 с AH=0 или AH=4C, или обратившись к подпрограмме по адресу 0050 в программном сегмент с AH=0 или AH=4C.

Примечание: при завершении иначе, чем операцией 4C, программа должна предварительно заслать в CS адрес начала своего программного сегмента.

Все четыре способа возвращают управление в резидентную частьCOMMAND.COM (при этом операция 4C передает код завершения). Все четыре способа приводят к продолжению выполнения программы, обратившейся к операции Exec (4B). При этом вектора прерываний 22, 23 и 24 (завершение, Ctrl-Break, фатальная ошибка обмена) восстанавливаются изПрефикса Программного сегмента возобновляемой задачи. Затем управление передается по адресу завершения. Если программа возвращается в COMMAND.COM, то управление передается в нерезидентную часть. Если это происходит во время выполнения командного файла, оно продолжается, иначе COMMAND выдает натерминал приглашение и ждет ввода следующей команды.

Когда загруженная программа получает управление, имеют место следующие условия:

Для всех программ:

  1. В префиксе программного сегмента по смещению 2C передается адрес среды. Среда представляет собой последовательность строкASCIIZ, вида параметр=значение. Общая длина строк среды не более 32 Кбайт; среда начинается с границы параграфа. После последней строки следует нулевой байт. Среда, передаваемая задаче от COMMAND, содержит, как минимум, параметр COMSPEC=(значение этого параметра — полное имя файла, содержащего используемыйCOMMAND.COM). Она также содержит значения, установленные командами PATH, PROMPT и SET. Передаваемая среда является копией среды родительского процесса. Если задача остается резидентом, то последующие команды PATH, PROMPT и SET не будут воздействовать на её среду.
  2. По смещению 0050 в префиксе программного сегмента содержится программа обращения к операциям DOS. Таким образом, занеся в AH номер операции, программа может вызвать процедуры (LCALL) по адресу PSP + 50, а не обращаться к прерыванию 21.
  3. Адрес буфера DTA установлен на PSP +80.
  4. Блоки управления файлами, расположенные по смещениям 5C и 6C в префиксе программного сегмента заполняются в соответствии с параметрамикомандной строки. При этом если соответствующий параметр включает имя каталога, в FCB заносится только код устройства, имя файла формируется неправильно.
  5. Неформатная часть, начинающаяся со смещения 81, содержит символы командной строки после имени команды, включая все пробелы и разделители. По смещению 80 помещена длина этой строки. Есликомандная строка включает параметры переназначения (на них указывают символы > и <) они не попадают сюда, так как переназначение прозрачно для программ.
  6. Слово по смещению 6 содержит число байт в данном сегменте.
  7. Регистр AX указывает, правильно ли заданы имена устройств в параметрах:
  • AL = FF — имя устройства для первого параметра задано неверно, иначе AL = 00;
  • AH = FF — имя устройства для первого параметра задано неверно, иначе AH = 00.

Для программ .EXE:

  1. DS и ES указывают на начало префикса программного сегмента.
  2. Регистры CS, IP, SS и SP получают значения, указанныекомпоновщиком.

Для программ .COM:

  1. Все четыре сегментных регистра указывают на префикс программного сегмента.
  2. Программе выделяется вся свободная память. Если программа запускает другие программы операцией Exec, то она должна освободить для неё часть памяти операцией Setblock (4A)
  3. Счетчик команд IP получает значение 0100H.
  4. Регистр SP указывает на конец программного сегмента. Длина сегмента в ячейке 6 префикса уменьшается на 0100H, чтобы освободить пространство для стека такого размера.
  5. На вершину стека помешается нулевое слово.

Примечания

[править |править код]
  1. Windows Authenticode Portable Executable Signature Format (англ.). Дата обращения: 11 декабря 2009. Архивировано изоригинала 1 марта 2012 года.
  2. How to open a .DLL or .EXE file in Resource Editor (англ.). Дата обращения: 11 декабря 2009. Архивировано изоригинала 1 марта 2012 года.
  3. Load Windows Programs From the DOS Prompt With WINSTART // PC Mag. —№ 30 июня 1992.

Ссылки

[править |править код]
  • EXE Format (англ.) — формат заголовка MZ
Информация должна бытьпроверяема, иначе она может быть удалена. Вы можетеотредактировать статью, добавив ссылки наавторитетные источники в видесносок.(11 ноября 2021)
Перейти к шаблону «Форматы исполняемых файлов»
Unix
Windows,DOS иOS/2
Прочие
Источник —https://ru.wikipedia.org/w/index.php?title=EXE&oldid=149839349
Категории:
Скрытые категории: