Заметка: все мультибайтовые ценности сохранены LSB сначала. Один блок составляет 512 байтов, один параграф составляет 16 байтов. См. также входные прерывания Ральфа Брауна ListOffset (hex) Означает 00-01 0x4d, 0x5a. Это – «магическое число» файла EXE. Первый байт файла – 0x4d, и вторым является 0x5a. 02-03 Число байтов в последнем блоке программы, которые фактически используются. Если эта значение – ноль, то это означает, что весь последний блок используется (то есть эффективное значение 512). 04-05 Число блоков в файле, которые являются частью файла EXE.Только если [02-03] являются отличными от нуля, то большая часть последнего блока используется. 06-07 Число данных перемещения, хранящихся после заголовка. Может быть нулевым. 08-09 Число параграфов в заголовке. Данные программы начинаются только после заголовка и эта область может использоваться, чтобы вычислить подходящее файловое смещение. Заголовок включает перемещенные записи. Заметьте, что некоторые OS и/или программы могут потерпеть рухнуть, если заголовок не кратен числу 512 байтов. 0A-0B Число параграфов дополнительной памяти, в которой будет нуждаться программа. Это – эквивалент размера BSS в программе Unix. Программа не может быть загружена, если нет по крайней мере этой памяти, доступной для нее. 0C-0D Максимальное число параграфов дополнительной памяти. Обычно, OS резервирует всю остающуюся обычную память для вашей программы, но вы можете ограничить это, играясь с этой областью(полем). 0E-0F Относительное значение сегмента стека. Эта значение добавлено к сегменту, в котором была загружена программа и результат используется, чтобы калибровать регистр SS. 10-11 Начальная знвчение регистра SP. 12-13 Контрольная сумма. Если установлено должным образом, 16-битовая сумма всех слов в файле должна быть нолем. Обычно, это не заполнено. 14-15 Начальное значение IP регистра. 16-17 Начальное значение регистра CS, относительно сегмента программа была загружена. 18-19 Смещение первого пункта перемещения в файле. 1A-1B Оверлейное число. Обычно ноль, означая, что это – главная программа. Вот структура, которая может быть использована, чтобы репрезентовать заголовок EXE и данные перемещения, принимающие 16- битовую машину LSB: Code struct EXE { unsigned short signature; /* == 0x5a4D */ unsigned short bytes_in_last_block; unsigned short blocks_in_file; unsigned short num_relocs; unsigned short header_paragraphs; unsigned short min_extra_paragraphs; unsigned short max_extra_paragraphs; unsigned short ss; unsigned short sp; unsigned short checksum; unsigned short ip; unsigned short cs; unsigned short reloc_table_offset; unsigned short overlay_number; }; Code struct EXE_RELOC { unsigned short offset; unsigned short segment; }; Смещение начала данных EXE вычислено подобно этому: exe_data_start = exe.header_paragraphs * 16L; Смещение байта стоящего после данных EXE (в DJGPP, размер заглушки и начало образа COFF), вычислены подобно этому: Code extra_data_start = exe.blocks_in_file * 512L; if (exe.bytes_in_last_block) extra_data_start -= (512 - exe.bytes_in_last_block);
|