2.5. Заголовок EXE-файла

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

 

      В начале  любого EXE-файла расположен  заголовок, состоящий

 из  постоянной  части  и  таблицы  настройки.  Стандартная часть

 заголовка имеет следующую структуру.

 

 Смещение  Длина  Содержимое           Комментарий

 ───────────────────────────────────────────────────────────────

                  ┌────┬────┐

  +0        2     │4Dh │5Ah │ Роспись EXE-файла ('MZ')

                  ├────┴────┤

  +2        2     │PartPage │ Длина неполной страницы (обычно

                  ├─────────┤ игнорируется)

  +4        2     │ PageCnt │ Длина образа в страницах по 512 байт,

                  ├─────────┤ включая заголовок

  +6        2     │ ReloCnt │ Количество элементов в таблице

                  ├─────────┤ настройки

  +8        2     │ HdrSize │ Размер заголовка в параграфах

                  ├─────────┤

  +0Ah      2     │ MinMem  │ Мин. память, требующаяся программе,

                  ├─────────┤ в параграфах

  +0Ch      2     │ MaxMem  │ Макс.память, требующаяся программе,

                  ├─────────┤ в параграфах

  +0Eh      2     │ ReloSS  │ Начало сегмента стека относительно

                  ├─────────┤ начала образа

  +10h      2     │ ExeSP   │ Начальное значение SP (указателя

                  ├─────────┤ стека)

  +12h      2     │ ChkSum  │ Контрольная сумма файла

                  ├─────────┤

  +14h      2     │ ExeIP   │ Начальное значение IP

                  ├─────────┤ (счетчика команд)

  +16h      2     │ ReloCS  │ Начало сегмента кодов относительно

                  ├─────────┤ начала образа

  +18h      2     │ Tbloff  │ Смещение до таблицы настройки

                  ├─────────┤ (обычно 001Ch)

  +1Ah      2     │ Overlay │ Номер перекрытия (0 для корневого

                  └─────────┘ модуля)

  +1Ch             Размер стандартной части заголовка

 

      Таблица  настройки   начинается  со  смещения   [Tbloff]  и

 содержит [ReloCnt] двойных слов вида

 

          ┌──────────┬─────────┐

          │ смещение │ сегмент │

          └──────────┴─────────┘

 

      Таблица настройки дополняется  нулями до границы параграфа;

 вслед за ней начинается образ программы.

 

      Опишем   подробно,   как   происходит   процесс   настройки

 EXE-программы. Поскольку  EXE-файл может быть  загружен с любого

 параграфа памяти, все абсолютные ссылки на сегменты, такие как

 

      mov   ax,seg _TEXT   или   call far ptr my_prog

 

 должны  быть "подправлены"  или настроены  на фактические адреса

 сегментов, в которые загружена  программа. Поэтому загрузчик ДОС

 (фн 4Bh) выполняет следующие действия.

 

      1. Создание PSP программы вызовом фн 26h.

 

      2.  Считывание  первых  1Ch  байтов  EXE-файла (стандартной

 части заголовка).

 

      3. Определение размера загрузочного модуля как

 

           (512*PageCnt)-(16*HdrSize)+PartPage

 

 и смещения его от начала файла как

 

           (16*HdrSize)

 

      4. Определение начального  сегмента для загрузки программы,

 Start_Seg (обычно Start_Seg = PSP+10h) и считывание загрузочного

 модуля в память с адреса Start_Seg:0.

 

      5. Позиционирование EXE-файла на начало таблицы настройки.

 

      6.  Для каждого  элемента таблицы  настройки (имеющего  вид

 I_Seg:I_off):

 

      - вычислить Relo_Seg = Start_Seg + I_Seg;

      - слово по адресу Relo_Seg:I_off увеличить на Start_Seg.

 

      7.  Выделить  программе  память  за  ее  пределами согласно

 MinMem и MaxMem.

 

      8.   Инициализировать   регистры   и   передать  управление

 программе:

           ES = DS = PSP

           AX = см. 2.1

           SS = Start_Seg + ReloSS ; SP = ExeSp;

           CS = Start_Seg + ReloCS ; IP = ExeIP

              (push segment; push offset; retf)

 

      Примечание:  Здесь  не  описаны  добавления  к EXE-формату,

 используемые  некоторыми программами  фирмы Microsoft, например,

 CodeView или Windows.

 

      См. также: Функции управления процессами

 

 

Вы находитесь в разделе: 

Добавить коментарий