Форматы исполняемых файлов
Форматы исполняемых файлов
В практической деятельности большинства программистов рано или поздно возникают проблемы, для решения которых необходимо знать форматы исполняемых файлов. Если ассемблер является отражением архитектуры компьютера, то формат исполняемого файла является отражением архитектуры операционной системы.
Этот и следующие уроки будут посвящены вопросам организации программирования на ассемблере для операционной системы Windows 95/98/NT. Формат исполняемого файла в этих системах отличается от формата файла операционной системы MS-DOS. Таким образом, мы будем иметь дело уже с несколькими форматами исполняемых файлов. Для повышения эффективности разработки программ на ассемблере необходимо понимать их отличия.
Основная программно-аппаратная платформа, на которой работают операционные системы фирмы Microsof, — компьютеры с архитектурой IBM PC. Номенклатура операционных систем, которые можно встретить сегодня на компьютерах данной архитектуры, следующая:
m MS-DOS;
m Windows 3.1;
m Windows 95/98;
m Windows NT;
m Unix-подобные системы, в частности различные варианты Linux.
С точки зрения архитектуры, данные системы имеют достаточно сильные отличия. Формат исполняемого файла должен в той или иной мере отражать эти отличия. В настоящее время существуют четыре формата исполняемых файлов для перечисленных операционных систем:
m .com (CP/M и MS-DOS);
m .exe (MS-DOS);
m .exe (Windows 3.1) или NE-формат исполняемых файлов;
m .exe (Windows 95/98/NT) или PE-формат исполняемых файлов;
m COFF- и ELF-форматы исполняемого файла UNIX.
Далее обсудим эти форматы в порядке их появления на свет. Заодно раскроем и исторический аспект этого вопроса.
Исполняемый файл 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-формата (листинг 1).
Листинг 1. Пример исходного файла программы в COM-формате
;---------Prg18_1.asm---------
;Пример программы в COM-формате.
;Основа примера — программа Prg_3_1.asm (урок 3)
;-----------------------------
code segment para public 'code' ;начало сегмента кода
assume cs:code, ds: code, ss: code
org 100h
main proc
jmp EndData
message db 'Введите две шестнадцатеричные цифры,$'
EndData:
;ds инициализирует система
mov ah, 9
mov dx, offset message
int 21h
xor ax, ax ;очистить регистр ax
mov ah, 1h ;1h в регистр ah
int 21h ;генерация прерывания с номером 21h
mov dl, al ;содержимое регистра al в регистр dl
sub dl, 30h ;вычитание: (dl)=(dl)-30h
cmp dl, 9h ;сравнить (dl) с 9h
jle M1 ;перейти на метку M1, если dl<9h или dl=9h
sub dl, 7h ;вычитание: (dl)=(dl)–7h
M1: ;определение метки M1
mov cl, 4h ;пересылка 4h в регистр cl
shl dl, cl ;сдвиг содержимого dl на 4 разряда влево
int 21h ;вызов прерывания с номером 21h
sub al, 30h ;вычитание: (dl)=(dl)-30h
cmp al, 9h ;сравнить (al) с 9h 28
jle M2 ;перейти на метку M2, если al<9h или al=9h
sub al, 7h ;вычитание: (al)=(al)-7h
M2: ;определение метки M2
add dl, al ;сложение: (dl)=(dl)+(al)
mov ax, 4c00h ;пересылка 4c00h в регистр ax
int 21h ;вызов прерывания с номером 21h
main endp
code ends ;конец сегмента кода
end main ;конец программы с точкой входа main
Такая структура исходного файла для COM-формата обусловлена тем, что построенный на его основе исполняемый файл является слепком участка памяти. После его загрузки операционной системе не требуется производить никаких настроек.
Интересно посмотреть на дамп COM-файла (рис. 1).
0000:0000 EB 26 90 C2 E2 E5 E4 E8 F2 E5 20 E4 E2 E5 20 F8 ..&Введите две ш
0000:0010 E5 F1 F2 ED E0 E4 F6 E0 F2 E5 F0 E8 F7 ED FB E5 естнадцатеричные
0000:0020 20 F6 E8 F4 F0 FB 2C 24 B4 09 BA 03 01 CD 21 33 цифры,$......!3
0000:0030 C0 B4 01 CD 21 8A D0 80 EA 30 80 FA 09 7E 03 80 ....!..Ђ.0Ђ..~.Ђ
0000:0040 EA 07 B1 04 D2 E2 CD 21 2C 30 3C 09 7E 02 2C 07 .......!,0<.~.,.
0000:0050 02 D0 B8 00 4C CD 21 ....L.!
Рис. 1. Дамп COM-файла
В отличие от других форматов исполняемых файлов, как мы увидим ниже, по внешнему виду приведенного дампа трудно определить (см. рис. 1), что этот файл тоже может быть загружен и выполнен. Это действительно образ памяти, который загружается операционной системой в сегмент со смещением 100h и исполняется. Необязательным признаком COM-файла является наличие в качестве первой инструкции команды перехода. В нашем случае — это EB 26 (jmp EndData).
Исполняемый файл MZ-формата (MS-DOS)
Разработанный фирмой Microsoft COM-формат исполняемых файлов мог применяться лишь для небольших программ. Для MS-DOS, поддерживающей сегментную организацию программы, был разработан специальный формат исполняемых файлов — MZ-формат. Это название условное, но оно будет полезно нам для дальнейшего обсуждения, и вот почему. В отличие от COM-формата (.com), расширения файлов всех остальных форматов — .exe. Требуется заглянуть внутрь содержимого исполняемого файла, чтобы понять, с каким конкретно форматом файла мы имеем дело. Поэтому для однозначности с каждым типом исполняемого файла связывается короткая аббревиатура, по которой понятно, о каком формате идет речь.
Итак, MZ-формат был разработан фирмой Microsoft для поддержки многосегментных программ в среде MS-DOS. С точки зрения структуры, файл MZ-формата имеет три части:
m заголовок;
m таблицу размещения;
m программный код.
Заголовок состоит из полей фиксированного размера (табл. 1).
Таблица 1. Содержимое полей заголовка файла MZ-формата
Смещение Длина Значение
0000h 2 байта Сигнатура
(фиксированная последовательность симво-
лов) — «MZ» (4d 5ah) или «ZM» (5a 4dh) (MZ — Mark
Zbikowski)
Весь исполняемый файл делится на страницы по 512 байт. Понятно, что совсем необязательно условие кратности длины файла этому значению. Поэтому следующее поле содержит длину остатка кода последней страницы исполняемого файла.
0002h 2 байта Количество
байт в последней странице файла MZ-фор-
мата. Равно остатку от деления длины файла
на зна-
чение 512
Поле 0004h содержит длину исполняемого файла в 512-байтных страницах.
0004h 2 байта Длина файла MZ-формата в 512-байтных страницах
0006h 2 байта Количество элементов в таблице размещения
Так как заголовок может иметь переменную длину, то поле 0008h сообщает его длину в 16-байтных параграфах. Эта информация используется загрузчиком операционной системы для определения начала загрузочного модуля.
0008h 2 байта Длина заголовка в параграфах
Следующие два поля сообщают минимальное и максимальное количество памяти (в параграфах), необходимое для исполнения программы, помимо размера ее программного кода.
000Ah 2
байта Минимальное количество дополнительных
параграфов,
необходимых для исполнения программы
000Ch 2
байта Максимальное количество дополнительных
параграфов,
необходимых для исполнения программы
Поля 000Eh и 00010h предназначены для хранения указателя стека ss:sp, но реально они формируются загрузчиком OC на стадии загрузки программы в память для выполнения.
000Eh 2 байта Начальное значение, загружаемое в регистр ss
0010h 2 байта Начальное значение, загружаемое в регистр sp
0012h 2
байта 0 или поразрядная дополненная контрольная
сумма
всех 16-битных слов в файле, за исключением
данного
поля
Следующие два поля определяют точку входа в программу после ее загрузки.
0014h 2
байта Значение, загружаемое в регистр ip
во время загрузки
программы в память
0016h 2
байта Значение, загружаемое в регистр cs
во время загрузки
программы в память (формируется загрузчиком)
0018h 2
байта Смещение от начала файла таблицы
размещения или
значение 40h, если это исполняемый файл
одного из фор-
матов NE, PE и т. д. (см. ниже)
Последнее поле предназначено для организации оверлейных программ. В нем содержится номер, в соответствии с которым впоследствии будет организована загрузка модулей, входящих в оверлейную программу. Для главной программы поле имеет значение 0.
001Ah 2 байта Номер оверлейного модуля
На этом заголовок заканчивается. Далее следует информация, зависящая от того программного средства, которое сформировало данный исполняемый файл. Представленный на рис. 2 исполняемый файл был сформирован программой TLINK версии 7.1 (фирмы Borland). Эта программа формирует следующую опознавательную информацию:
001Eh 1 байт Сигнатура 0fbh
001Fh 1 байт Версия TLINK
0020h 2 байта Сигнатура 6a72h
Другие программы, например архиваторы, формирующие саморазворачивающиеся файлы (self-extracting), также помещают в эту область уникальную информацию. Зная это, вы можете уточнить информацию о программе, сформировавшей исполняемый файл.
В поле со смещением 0018h находится значение смещения таблицы размещения. Что это за таблица? Таблица размещения представляет собой совокупность элементов, предназначенных для связи сегментов в программе. Число элементов таблицы содержится в поле со смещением 0006h. Каждый элемент имеет следующий формат:
0000h 2 байта Смещение внутри сегмента
0002h 2 байта Сегмент размещения
Во время загрузки программы в память к ней добавляется префикс программного сегмента (PSP — program segment prefix) размером 256 байт. Сама программа загружается вслед за этим префиксом. Информация из префикса может быть использована для выделения символов из командной строки, определения объема доступной памяти, информации об окружении и т. д. В заключение отметим содержимое регистров после загрузки файла MZ-формата:
m ax — количество символов в командной строке;
m bx:cx — размер загрузочного модуля;
m ds и es — сегментные составляющие адреса начала PSP данной программы. При необходимости их нужно подстраивать. Мы это делали постоянно при написании программ, вставляя в начало исполняемой части программы команды код, подобный следующему:
mov ax,data
mov ds,ax
m ss:sp — указатель на вершину стека;
m cs:ip — адрес точки входа программы, то есть той инструкции, адрес которой указан меткой в заключительной директиве программы end.
0000:0000 4D 5A 64 01 02 00 01 00 20 00 00 00 FF FF 03 00 MZd..... .......
0000:0010 00 01 00 00 00 00 13 00 3E 00 00 00 01 00 FB 71 ........>......q
0000:0020 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 jr..............
0000:0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ................
0000:0040 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000:0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
… … … далее тоже самое
0000:01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000:0200 C2 E2 E5 E4 E8 F2 E5 20 E4 E2 E5 20 F8 E5 F1 F2 ....... ... ....
0000:0210 ED E0 E4 F6 E0 F2 E5 F0 E8 F7 ED FB E5 20 F6 E8 ............. ..
0000:0220 F4 F0 FB 2C 24 00 00 00 00 00 00 00 00 00 00 00 ...,$...........
0000:0230 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????
… … … далее тоже самое
0000:0320 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????
0000:0330 B8 00 00 8E D8 B4 09 BA 00 00 CD 21 33 C0 B4 01 ...........!3...
0000:0340 CD 21 8A D0 80 EA 30 80 FA 09 7E 03 80 EA 07 B1 .!..Ђ.0Ђ..~.Ђ...
0000:0350 04 D2 E2 CD 21 2C 30 3C 09 7E 02 2C 07 02 D0 B8 ....!,0<.~.,....
0000:0360 00 4C CD 21
Рис. 2. Дамп EXE-файла MZ-формата
Исполняемый файл NE-формата (Windows 3.x)
NE-формат (New Executeable code file) исполняемого файла был разработан для операционной системы Windows 2.0. Этот же формат использовался в операционной системе OS/2 фирмы IBM. Исполняемый файл NE-формата состоит из двух исполняемых файлов:
m исполняемый файл MZ-формата;
m исполняемый файл 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-формата показан в табл. 2.
Таблица 2. Содержимое полей DOS-заголовка файла NE-формата
Смещение Длина поля Содержимое
0000h 32
байта Заголовок исполняемого файла MS-DOS
(см. табл. 1,
поля 0000-0018h)
0020h 28 байт 0 (резерв)
003ch 2
байта Если значение поля со смещением
0018h равно или
больше значения 40h, то это приложение
Windows
и данное поле содержит смещение от начала
файла
до начала заголовка Windows-приложения
003eh 2 байта 0 (резерв)
0040h ? байт Программа-заглушка MS-DOS
Рис. 3. Структура исполняемого файла NE-формата
Как уже было отмечено, в поле со смещением 003ch от начала файла содержится смещение начала данных, относящихся непосредственно к Windows-приложению. Эти данные начинаются с заголовка, содержимое которого описано в табл. 3 (все смещения, если не оговорено специально, считаются от начала NE-заголовка, а не от начала файла).
0000:0000 4D 5A 6B 00 BD 04 00 00 20 00 00 00 FF FF 07 00 MZk..... .......
0000:0010 00 01 65 40 00 00 00 00 40 00 00 00 01 00 00 00 ..e@....@.......
0000:0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000:0030 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 ................
0000:0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
… … … далее тоже самое
0000:01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000:0200 E8 53 00 54 68 69 73 20 70 72 6F 67 72 61 6D 20 .S.This program
0000:0210 72 65 71 75 69 72 65 73 20 4D 69 63 72 6F 73 6F requires Microso
0000:0220 66 74 20 57 69 6E 64 6F 77 73 2E 0D 0A 24 20 20 ft Windows...$
0000:0230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000:0240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000:0250 20 20 20 20 20 20 5A 0E 1F B4 09 CD 21 B8 01 4C Z.....!..L
0000:0260 CD 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .!..............
0000:0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
… … … далее тоже самое
0000:03F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000:0400 4E 45 05 3C 75 07 CF 0C 00 00 00 00 01 83 22 00 NE.<u.........".
0000:0410 00 00 00 00 02 1E 15 00 00 00 00 00 22 00 07 00 ............"...
0000:0420 5E 22 40 00 50 01 15 07 3A 07 48 07 44 18 00 00 ^"@.P...:.H.D...
0000:0430 FA 01 05 00 00 00 02 00 00 00 00 00 00 00 00 04 ................
0000:0440 D6 01 2A 18 40 0D 2C 18 A2 02 A4 1E 50 0D A4 1E ..*.@.,.....P...
0000:0450 A0 03 A7 AC 50 0D A8 AC 1D 09 AF 63 50 0D B0 63 ....P......cP..c
0000:0460 4B 0C DC 2D 50 1D DC 2D C6 0D DA 83 50 1D DA 83 K..-P..-....P...
0000:0470 FA 11 97 B8 50 1D 98 B8 D0 17 62 60 50 1D 62 60 ....P.....b`P.b`
0000:0480 E2 1A 00 34 50 1D 00 34 89 1C 09 4F 50 1D 0A 4F ...4P..4...OP..O
0000:0490 0E 1F 6C 23 50 1D 6C 23 33 20 B3 5F 50 1D B4 5F ..l#P.l#3 ._P.._
0000:04A0 3D 23 2A 6B 50 1D 2A 6B A8 26 41 31 50 1D 42 31 =#*kP.*k.&A1P.B1
0000:04B0 3A 28 7A 45 50 1D 7A 45 78 2A 11 3D 50 1D 12 3D :(zEP.zEx*.=P..=
… … …
Рис. 4. Фрагмент дампа EXE-файла NE-формата
Таблица 3. Содержимое полей Windows-заголовка файла NE-формата
Смещение Длина Значение
0000h 2 байта Сигнатура — «NE» (4e 45h)
0002h 2
байта Версия и модификация версии программы
компоновщика
TLINK, создавшей данный исполняемый файл
0004h 2
байта Смещение таблицы входов (относительно
начала NE-заго-
ловка)
0006h 2 байта Длина таблицы входов (в байтах)
0008h 4 байта 0
000ch 2
байта Байт флагов, описывающих содержимое
исполняемого
файла
Содержимое последних байт представляет собой комбинацию бит, по которой можно судить, что собой представляет исполняемый файл и каковы его особенности размещения в памяти. Местоположение некоторых из этих флагов показано в табл. 4.
Таблица 3. Поля Windows-заголовка файла NE-формата (продолжение)
Смещение Длина Значение
000eh 2
байта Число сегментов автоматических
данных. Если биты 0 и 1
в поле флагов (см. табл. 4) равны 0, то это
поле равно 0
0010h 2 байта Определяет размер (в байтах) локальной кучи
0012h 2 байта Определяет размер стека (в байтах)
0014h 4 байта Значение
в cs:ip — адрес точки входа:
cs
(старшее слово) — индекс сегмента кода
в таблице
сегментов (см. ниже);
ip
(младшее слово) — смещение в сегменте
кода
0018h 4 байта Значение
в ss:sp — адрес вершины стека
ss
(старшее слово) — индекс сегмента стека
в таблице
сегментов (см. ниже);
sp
(младшее слово) — смещение в сегменте
стека
001ch 2
байта Количество сегментов в модуле (число
элементов в таблице
сегментов)
001eh 2
байта Количество элементов в таблице
модулей (то есть это, факти-
чески, количество импортируемых модулей).
Поле связано
с таблицей ссылок, адрес которой находится
в слове 0028h
0020h 2 байта Размер в байтах таблицы нерезидентных имен
0022h 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы сегментов
0024h 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы ресурсов
0026h 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы резидентных имен
0028h 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы ссылок на модули
002ah 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы внешних (импортируемых) имен
002ch 2
байта Относительное смещение от начала
NE-заголовка до начала
таблицы нерезидентных имен
002eh 2 байта Не используется
0030h 2 байта Количество перемещаемых точек входа
0032h 2
байта Определяет величину, в соответствии
с которой производится
разбиение исполняемого файла в NE-формате
на логические
сектора (возможно, не равные по размеру
физическим). В этих
сегментах располагается содержимое сегментов
исходной
программы и ресурсов. Учет занимаемого
ими пространства
также производится в этих логических
сегментах. Для полу-
чения размера логического сектора необходимо
число 2 воз-
вести в степень равную значению этого
поля. Устанавливается
опциями /Align:n (link фирмы Microsoft) или /A=n
(tlink
фирмы Borland (Inprise)). Если n=16, то значение в этом поле
равно 4, если n=512, то значение в этом поле
равно 9

- Форматы магазинов
- Форматы радиостанций
- Форматы файлов компьютерной графики
- Форматы хранения графических данных
- Форматы цифрового изображения
- Форматы цифровых изображений
- Форматы электронных изданий
- Форма счетоводства Матье де ла Порта
- Форматирование документа
- Форма трудового договора
- Форма трудового договора
- Форматы графических данных
- Форматы графических файлов
- Форматы графических файлов