Компоновщик устанавливает этот код для идентификации правильного EXE-файла.
Число байтов в последнем блоке EXE-файла.
Число 512 байтовых блоков EXE-файла, включая заголовок.
Число настраиваемых элементов.
Число 16-байтовых блоков (параграфов) в заголовке, (необходимо для локализации начала выполняемого модуля, следующего после заголовка).
0A
Минимальное число параграфов, которые должны находится после загруженной программы.
0C
Переключатель загрузки в младшие или старшие адреса. При компоновке программист должен решить, должна ли его программа загружаться для выполнения в младшие адреса памяти или в старшие Обычным является загрузка в младшие адреса. Значение шест.0000 указывает на загрузку в старшие адреса, а шест.FFFF — в младшие. Иные значения определяют максимальное число параграфов, которые должны находиться после загруженной программы.
0E
Относительный адрес сегмента стека в выполняемом модуле.
Адрес,который загрузчик должен поместить в регистр SP перед передачей управления в выполнимый модуль.
Контрольная сумма — сумма всех слов в файле (без учета переполнений) используется для проверки потери данных.
Относительный адрес, который загрузчик должен поместить в регистр IP до передачи управления в выполняемый модуль.
Относительный адрес кодового сегмента в выполняемом модуле. Этот адрес загрузчик заносит в регистр CS.
Смещение первого настраиваемого элемента в файле.
1A
Номер оверлейного фрагмента: нуль обозначает, что заголовок относится к резидентной части EXE-файла.
1C
Таблица настройки, содержащая переменное число настраиваемых элементов, соответствующее значению по смещению 06.
Заголовок имеет минимальный размер 512 байтов и может быть больше, если программа содержит большое число настраиваемых элементов. Позиция 06 в заголовке указывает число элементов в выполняемом модуле, нуждающихся в настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1C заголовка, состоит из двухбайтовых величин смещений и двухбайтовых сегментных значений.
Система строит префикс программного сегмента следом за резидентной частью COMMAND.COM, которая выполняет операцию загрузки. Затем COMMAND.COM выполняет следующие действия:
uСчитывает форматированную часть заголовка в память.
uВычисляет размер выполнимого модуля (общий размер файла в позиции 04 минус размер заголовка в позиции 08) и загружает модуль в память с начала сегмента.
uСчитывает элементы таблицы настройки в рабочую область и прибавляет значения каждого элемента таблицы к началу сегмента (позиция OE).
uУстанавливает в регистрах SS и SP значения из заголовка и прибавляет адрес начала сегмента.
uУстанавливает в регистрах DS и ES сегментный адрес префикса программного сегмента.
uУстанавливает в регистре CS адрес PSP и прибавляет величину смещения в заголовке (позиция 16) к регистру CS. В случае, если сегмент кода непосредственно следует за PSP, то смещение в заголовке равно 256 (шест.100). Регистровая пара CS:IP содержит стартовый адрес в кодовом сегменте, то есть, начальный адрес программы.
После инициализации регистры CS и SS содержат правильные адреса, а регистр DS (и ES) должны быть установлены в программе для их собственных сегментов данных:
1. PUSH DS ;Занести адрес PSP в стек
2. SUB AX,AX ;Занести нулевое значение в стек
3. PUSH AX ; для обеспечения выхода из программы
4. MOV AX,datasegname ;Установка в регистре DX
5. MOV DS,AX ; адреса сегмента данных
При завершении программы команда RET заносит в регистр IP нулевое значение, которое было помещено в стек в начале выполнения программы. В регистровой паре CS:IP в этом случае получается адрес, который является адресом первого байта PSP, где расположена команда INT 20H. Когда эта команда будет выполнена, управление перейдет в DOS.