5.1.4          Формат ЕХЕ файлу на диску та налагодження адрес

Програми що виконуються в MS-DOS можуть мати один з двох можливих форматів, які прийнято розрізняти за розширеннями їх файлів: .ЕХЕ та .СОМ формати.

Відмітимо що EXE- файли в MS-DOS мають відповідати певному стандарту. Всім ЕХЕ файлам що зберігаються на диску передує спеціальний блок – заголовок (header), в якому міститься інформація для налагодження адрес і встановлення регістрів процесора. СОМ файли завантажуються швидше, так як не потребують налагодження адрес. Разом з цим СОМ-файл має недолік так як його розмір не може перевищувати 64 Кб.

Налагодження адрес необхідна через наступні причини. Багато машинних команд (наприклад виклик процедури з прямою адресацією, далекий безумовний перехід з прямою адресацією, та ін.) включають значення сегмента адреси. Але в MS-DOS програми можуть завантажуватися в пам’ять з будь-якої адреси. Точне значення з якого буде починатися програма MS-DOS дізнається тільки у момент завантаження програми і, звичайно, він невідомий компілятору та компонувальнику при побудові завантажувального модуля.

Компонувальник будує завантажувальний модуль відносно деякої уявної “адреси 0”, і всі інструкції, які потребують значення сегмента виявляються незавершеними. Вони містять не справжнє значення сегментів адрес, а їх відстань в параграфах від точки “0”. Тому такі інструкції потребують коригування після завантаження програми. Це коригування і складає суть налагодження адрес. Після завантаження програми “адреса 0” дорівнює номеру параграфа першого вільного блоку пам’яті. Це значення додається до всіх відносних адрес сегментів машинних команд. Компонувальник будує спеціальну таблицю, кожний елемент в якій складається з двох полів: двобайтового зміщення та наступного за ним сегмента. Ці два поля показують зміщення відносно адреси “0” до того слова яке потребує модифікації після завантаження програми. Таким чином ЕХЕ-файл що зберігається на диску має наступний вигляд

Мал. 9. Структура .EXE – файлу на диску

Перші 1Bh байт заголовку форматуються так, як це показано у Табл. 12.

Табл. 12. Формат заголовка .EXE – файлу на диску

Зсув (в 16 с/с)

Вміст

00-01

4Dh, 5Ah сигнатура редактора зв’язків.

02-03

Довжина образу за модулем 512 (залишок від ділення розміру завантажувального модуля на 512)

04-05

Розмір файлу у 512-байтових одиницях (сторінках), включаючи заголовок.

06-07

Число елементів таблиці налагодження адрес

08-09

Розмір заголовку у параграфах

0А-0В

Мінімальне число додаткових параграфів, необхідних програмі, яка завантажується

0C-0D

Максимальне число додаткових параграфів, необхідних програмі, що завантажується

0E-0F

Зсув у параграфах сегмента стека (SS0) у завантажувальному модулі

10-11

Значення SP (SP0) при передачі керування програмі

12-13

Слово контрольної суми – сума всіх слів файлу з ігноруванням  переповнення

14-15

Значення IP (IP0) при передачі керування програмі

16-17

Зсув у параграфах сегмента коду (СS0) в завантажувальному модулі

18-19

Зсув (байт) в межах файлу до першого елементу таблиці налагодження адрес

1А-1В

Оверлейне число (0 для резидентної частини програми)

Завантаження файлу та налагодження адрес виконує спеціальна програма (так званий переміщувальний завантажувач). Завантажувач викликається функцією EXEC. Послідовність дій при виконанні EXEC є такою:

1)     відшукується файл, який містить завантажувальний модуль, перевіряється його сигнатура та визначається розмір модуля;

2)     запитується блок пам’яті для середовища програми в який копіюється середовище батьківської програми, або рядки середовища, сформованої батьківською програмою;

3)     запитується блок пам’яті достатній для завантаження програми (початковий параграф виділеного блоку далі будемо позначати NS0);

4)     будується PSP програми, починаючи з першого вільного параграфу після резидентної частини програми;

5)     з початкового сегменту у пам’ять поміщається завантажувальний модуль;

6)     оброблюється таблиця налагодження адрес. Елементи у таблиці розташовуються у тому порядку, у якому вони зустрічались компонувальнику. Значення сегменту, вказане в елементі таблиці налагодження, складається зі значенням початкового сегменту. Отримане значення сегменту і зсув, вказаний в елементі налагодження, задають адресу слова завантажувального модуля в оперативній пам’яті, який вимагає модифікації. До цього слова додається початковий сегмент, і слово знов записується в пам’ять. Тепер дане слово містить абсолютну ( надбудовану) адресу;

7)     виконується встановлення регістрів процесора. Правила, встановлені MS-DOS, різні для .COM та .EXE-файлів.

5.1.4.1      Для .COM-файлів

DS = ES = SS = CS = NS0, IP = 100h, SP = FFFEh,

де NS0 – початковий сегмент програми. Крім того, додатково в стек за адресою NS0:FFFF записується слово нулів.

5.1.4.2      Для .EXE-файлів

DS = ES = NS0, CS = NS0 + 10h + CS0,

SS = NS0 + 10h + SS0, SP = SP0, IP = IP0,

де NS0– початковий сегмент програми; CS0, SS0, SP0, IP0 – значення із заголовку .EXE-файлу. Відмітимо, що єдиний спосіб установки регістрів CS та IP – це передача керування в точку з заданими значеннями. Через це на останньому кроці по установці регістрів завантажувач передає керування в точку, яка задається приведеними значеннями CS та IP.

5.1.5          Перетворення .EXE-файлів в .COM-файли

Для того щоб програму можна було перетворювати в .COM-формат з .EXE -файлу, вона повинна задовольняти певним вимогам. В Turbo C вони виконуються автоматично, якщо програма компілюється з опцією моделі пам’яті TINY. Після того, як .EXE-файл був отриманий, використовується спеціальна утиліта, яка входить у склад MS-DOS-exe2bin. Наприклад, якщо після редагування зв’язків було отримано файл, у командному рядку треба набрати:

C\TC\BIN > exe2bin myprog myprog.com

Відмітимо, що скомпільована у моделі пам’яті TINY програма не завжди може бути перетворена в .COM-файл.