Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книги 1-2, М.: Диалог-МИФИ, 1991. 3.2. Процесс загрузки программ в памятьЗагрузка COM- и EXE-программ происходит по-разному, однако есть некоторые действия, которые операционная система выполняет в обоих случаях одинаково.
А дальше действия системы по загрузке программ форматов COM и EXE будут различаться. Для COM-программ, которые представляют собой двоичный образ односегментной программы, выполняется чтение файла программы с диска и запись его в память по адресу PSP:0100. Вообще говоря, программы типа COM могут состоять из нескольких сегментов, но в этом случае они должны сами управлять содержимым сегментных регистров, используя в качестве базового адреса адрес PSP. После загрузки файла операционная система для COM-программ выполняет следующие действия:
указатель команд IP устанавливается на 100h (начало программы) с помощью команды JMP по адресу PSP:100. Загрузка EXE-программ происходит значительно сложнее, так как связана с настройкой сегментных адресов:
size=((file_size*512)-(hdr_size*16)-part_pag
1. Считывается содержимое элемента таблицы как два двухбайтных слова (OFF,SEG). 2. Вычисляется сегментный адрес ссылки перемещения REL_SEG = (START_SEG + SEG) 3. Выбирается слово по адресу REL_SEG:OFF, к этому слову прибавляется значение START_SEG, затем сумма записывается обратно по тому же адресу.
При инициализации регистры ES и DS устанавливаются на PSP, регистр AX устанавливается так же, как и для COM-программ, в сегментный регистр стека SS записывается значение START_SEG + ss_reg, а в SP записывается sp_reg. Для запуска программы в CS записывается START_SEG+cs_reg, а в IP - ip_reg. Такая запись невозможна напрямую, поэтому операционная система сначала записывает в свой стек значение для CS, затем значение для IP и после этого выполняет команду дальнего возврата RETF (команда возврата из дальней процедуры). |