Описание:
1 2 3 4 5 6 7 |
В отличии от COM-программы, EXE-программы могут состоять из нескольких сегментов. Кодов, данных, стека. EXE-программы могут занимать больше 64Кбайт. EXE-файл имеет заголовок, который используется при его загрузке. Заголовок состоит из: форматированной части содержащей сигнатуру и данные, необходимые для загрузки EXE-файла, и таблицы настройки адресов (Relocation Table) Таблица состоит из значений в формате сегмент:смещение. |
Запуск EXE-программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
0. вызов функции DOS4Bh 1. Определяется сегментный адрес свободного участка памяти, размер которого достаточен для размещения программы. 2. Создается и заполняется блок памяти для переменной среды. 3. Создается блок памяти для PSP и программы (сегмент:0000h - PSP; сегмент+0010h:0000h - программа) В поле PSP заносятся соответствующие значения. 4. Адрес DTA устанавливается равным PSP:0080h. 5. В рабочую область загрузчика считывается форматированная часть заголовка EXE-файла. 6. Вычисляется длина загрузочного модуля по формуле: Size=((PageCnt*512)-(HdrSize*16))-PartPag. 7. Определяется смещение загрузочного модуля в файле, равное HdrSize*16. 8. Вычисляется сегментный адрес (START_SEG) для загрузки - обычно это PSP+10h 9. Считывается в память загрузочный модуль (начиная с адреса START_SEG:0000). 10. Для каждого входа таблицы настройки: а) читается слово I_OFF и I_SEG б) вычитается RELO_SEG=START_SEG+I_SEG в) читается слово по адресу RELO_SEG:I_OFF г) к прочитанному слову прибавляется START_SEG д) результат заполняется по тому же адресу(RELO_SEG:I_OFF) 11. Распределяется память для программ в соответствии с MaxMEM и MinMem 12. Инициализируются регистры, выполняются программа: а) ES=DS=PSP б) AX=результат проверки правильности идентификаторов драйверов, указанных в командной строке в) SS=START_SEG+ReloSS, SP=ExeSP г) CS=START_SEG+ReloCS, IP=ExeIp |