Структура файлов .EXE и их загрузка

Скачать реферат: Структура файлов .EXE и их загрузка

Содержание реферата

1. Состав файла EXE

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

Литература:

1. Состав файла EXE

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

- управляющая информация для загрузчика.

- собственно загрузочный модуль.

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

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

Смещение Содержимое

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. В области памяти после резидентной части выполняющей загрузку программы строится Префикс Программного сегмента.

2. Стандартная часть заголовка считывается в память.

3. Определятся длина тела загрузочного модуля (разность длины файла 04-07 и длины заголовка 08-09 плюс число байт в последнем блоке 02-03). В зависимости от признака, указывающего загружать задачу в конец памяти или в начало, определяется сегментный адрес для загрузки.

Этот сегмент называется начальным сегментом.

4. Загрузочный модуль считывается в начальный сегмент.

5. Таблица настройки порциями считывается в рабочую память.

6. Для каждого элемента таблицы настройки к полю сегмента прибавляется сегментный адрес начального сегмента. В результате элемент таблицы указывает на нужное слово в памяти; к этому слову прибавляется сегментный адрес начального сегмента.

7. Когда таблица настройки адресов обработана, регистрам SS и SP придаются значения, указанные в заголовке, к SS прибавляется сегментный адрес начального сегмента. В ES и DS засылается сегментный адрес начала Префикса Программного сегмента. Управление передается загруженной задаче по адресу, указанному в заголовке (байты 14-17).

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

При обращении к нерезидентной команде или вызове программы операцией 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 вы дает на терминал приглашение и ждет ввода следующей команды.

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

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

- В Префиксе Программного сегмент по смещению 2C передается адрес среды. Среда представляет собой последователъностъ строк ASCIIZ, вида параметр=значение

Общая длина строк среды <= 32K байт; среда начинается с границы параграфа. После последней строки следует нулевой байт. Среда, передаваемая задаче от COMMAND, содержит, как минимум, параметр COMSPEC= (значение этого параметра - полное имя файла, содержащего используемый COMMAND.COM). Она также содержит значения, установленные командами PATH, PROMPT и SET (См. Главу 10). Передаваемая среда является копией среды родительского процесса. Если задача остается резидентом, то последующие команды PATH, PROMPT и SET не будут воздействовать на ее среду.

- По смещению 0050 в Префиксе Программного сегмента содержится программа обращения к операциям DOS. Таким образом, занеся в AH номер операции, программа может вызвать процедуры (LCALL) по адресу PSP + 50, а не обращаться к прерыванию 21.

- Адрес буфера DTA установлен на PSP +80.

- Блоки управления файлами, расположенные по смещениям 5C и 6C в Префиксе Программного сегмента заполняются в соответствии с параметрами командной строки. При этом если соответствующий параметр включает имя каталога, в FCB заносится только код устройства, имя файла формируется неправильно.

- Неформатная часть, начинающаяся со смещения 81, содержит символы командной строки после имени команды, включая все пробелы и разделите ли. По смещению 80 помещена длина этой строки. Если командная строка включает параметры переназначения (на них указывают символы > и <) они не попадают сюда, так как переназначение прозрачно для программ.

- Слово по смещению 6 содержит число байт в данном сегменте.

- Регистр AX указывает, правильно ли заданы имена устройств в параметрах:

AL = FF - имя устройства для первого параметра задано неверно, иначе AL = 00;

AH = FF - имя устройства для первого параметра задано неверно, иначе AH = 00.

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

- DS и ES указывают на начало Префикса Программного сегмента.

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

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

- Все четыре сегментных регистра указывают на Префикс Программного сегмента.

- Программе выделяется вся свободная память. Если программа запускает другие программы операцией Exec, то она должна освободить для нее часть памяти операцией Setblock (4A)

- Счетчик команд IP получает значение 0100H.

- Регистр SP указывает на конец программного сегмента. Длина сегмента в ячейке 6 Префикса уменьшается на 0100H, чтобы освободить пространство для стека такого размера.

- На вершину стека помешается нулевое слово Префикс Программного сегмента имеет следующий формат (все числа
шестнадцатеричные):

     ---------------------------------------------------------------
     |    0  |   1  |   2   |   3   |   4   |   5   |   6   |  7    |
--------------------------------------------------------------- | INT | Top of | Re- | Long call to DOS |
| 20H | memory |served | OP # bytes |
| | | | CODE in segment |
--------------------------------------------------------------- | 8 | 9 | A | B | C | D | E | F |
--------------------------------------------------------------- | cont.segment | Terminate | Terminate |Ctrl-break exit|
| of long call | address IP | address CS |address IP |
--------------------------------------------------------------- | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
--------------------------------------------------------------- |Ctrl-break exit Critical error exit address | Reserved |
|address CS | IP CS | |
--------------------------------------------------------------- | 18 | 19 | 2A | 2B | 2C | 2D | 2E .... 4F |
--------------------------------------------------------------- | R e s e r v e d |Segment address| Reserved |
| |of environment | |
--------------------------------------------------------------- | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
--------------------------------------------------------------- | DOS call | R e s e r v e d |
--------------------------------------------------------------- | 58 | 59 | 5A | 5B | 5C | 5D | 5E | 5F |
--------------------------------------------------------------- | R e s e r v e d | Unopened Standart FCB1 |
--------------------------------------------------------------- | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
--------------------------------------------------------------- | Unopened Standart FCB1 (cont.) |
--------------------------------------------------------------- | 68 | 69 | 6A | 6B | 6C | 6D | 6E | 6F |
--------------------------------------------------------------- | F C B 1 (cont.) | Unopened Standart FCB2 |
--------------------------------------------------------------- | 70 to 7F |
--------------------------------------------------------------- | Unopened Standart FCB2 (cont.) |
--------------------------------------------------------------- | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 |
--------------------------------------------------------------- | Parm | Command parameters starting with leading blanks |
| length| |
--------------------------------------------------------------- | F8 | F9 | FA | FB | FC | FD | FE | FF |
--------------------------------------------------------------- | C o m m a n d p a r a m e t e r s |
----------------------------------------------------------------

Примечания:

1. Граница памяти - номер первого свободного параграфа; напр. 1000 соответствует 64K.
2. Слово по смещению 6 содержит число байт в данном сегменте.
3. Слово по смещению 2C содержит сегментный адрес среды.
4. Программа не должна изменятъ частъ PSP от 00 до 5C.

Литература:

1. Джордан Справочник программиста персональных компьютеров

2. Нортон Архитектура персональных компьютеров фирмы IBM

3. Бэк Введение в системное программирование