1. Склад файлу EXE
Файл EXE, який будує компоновщик складається з двох частин:
- керуюча інформація для завантажувача.
- власне завантажувальний модуль.
Інформація для завантажувача, описана нижче, розташована на початку файлу і утворює так званий заголовок. Відразу за ним слід тіло завантажувального модуля. Тіло завантажувального модуля починається на кордоні блоку і являє собою копію образу пам'яті завдання, яку побудував кому поновщік.
Стандартна частина заголовка має такий вигляд:
00-01 4D5A - "подпіс'" компоновщика, яка вказує, що файл є файлів EXE.
02-03 Довжина способу завдання по модулю 512 (тобто число корисних байт в останньому блоці).
(Компонувальником версій до 1.10 поміщали в це поле 04; якщо воно має таке значення, його рекомендується ігнорувати).
04-05 Довжина файлу в блоках.
08-09 Довжина заголовка в 16-ти байтних параграфах.
Використовується для з'ясування початку тіла завантажувального модуля.
0A-0B Мінімальний обсяг пам'яті, яку потрібно виділити після кінця способу завдання.
(В 16-ти байтних параграфах).
0C-0D Максимальний обсяг пам'яті, яку потрібно виділити після кінця способу завдання.
(В 16-ти байтних параграфах).
10-11 Значення SP при вході в задачу.
12-13 Контрольна сума - нуль мінус результат складання без перенесення всіх слів файлу.
14-15 Значення IP (лічильника команд) при вході в задачу.
1A-1B Номер сегмента перекриттів.
(0 для кореневого сегмента програми).
Налаштування проводиться таким чином:
1. В області пам'яті після резидентної частини виконує завантаження програми будується Префікс Програмного сегмента.
2. Стандартна частина заголовка зчитується в пам'ять.
Цей сегмент називається початковим сегментом.
4. Завантажувальний модуль зчитується в початковий сегмент.
5. Таблиця настройки порціями зчитується в робочу пам'ять.
2. Структура програмного сегмента
По зсуву 0000 в програмному сегменті DOS формує Префікс Програмного сегмента (PSP). Сама програма завантажується по зміщенню 0100.
Коли завантажена програм отримує управління, мають місце такі умови:
Для всіх програм:
Загальна довжина рядків середовища <= 32K байт; среда начинается с границы параграфа. После последней строки следует нулевой байт. Среда, передаваемая задаче от COMMAND, содержит, как минимум, параметр COMSPEC= (значение этого параметра - полное имя файла, содержащего используемый COMMAND.COM). Она также содержит значения, установленные командами PATH, PROMPT и SET (См. Главу 10). Передаваемая среда является копией среды родительского процесса. Если задача остается резидентом, то последующие команды PATH, PROMPT и SET не будут воздействовать на ее среду.
- Блоки управління файлами, розташовані по зсувах 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, щоб звільнити простір для стека такого розміру.
- На вершину стека збожеволіє нульове слово Префікс Програмного сегмента має наступний формат (всі числа
шістнадцятиричні):
література:
1. Джордан Довідник програміста персональних комп'ютерів
2. Нортон Архітектура персональних комп'ютерів фірми IBM
3. Бек Введення в системне програмування