Автор: Пользователь скрыл имя, 03 Октября 2011 в 21:21, реферат
В практической деятельности большинства программистов рано или поздно возникают проблемы, для решения которых необходимо знать форматы исполняемых файлов. Если ассемблер является отражением архитектуры компьютера, то формат исполняемого файла является отражением архитектуры операционной системы.
В практической деятельности большинства программистов рано или поздно возникают проблемы, для решения которых необходимо знать форматы исполняемых файлов. Если ассемблер является отражением архитектуры компьютера, то формат исполняемого файла является отражением архитектуры операционной системы.
Этот и следующие уроки будут посвящены вопросам организации программирования на ассемблере для операционной системы 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.
Далее обсудим эти форматы в порядке их появления на свет. Заодно раскроем и исторический аспект этого вопроса.
Данный формат исполняемого файла является самым старым. Если считать началом «нашей эры» конец 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).
Разработанный фирмой 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). Эта программа формирует следующую опознавательную информацию: