MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 3.2. Процесс загрузки программ в памятьЗагрузка com- и exe-программ происходит по-разному, однако есть некоторые действия, которые операционная система выполняет в обоих случаях одинаково:
А дальше действия системы по загрузке com- и exe-программ будут различаться. Для com-программ, которые представляют собой двоичный образ односегментной программы, выполняется чтение файла программы с диска и запись его в память по адресу PSP :0100h. Размер обычных com-программ, как мы уже говорили, не превышает 64 Кбайт, так как они состоят только из одного сегмента. Но, строго говоря, com-программы могут состоять и из нескольких сегментов. В этом случае они должны сами управлять содержимым сегментных регистров, используя в качестве базового адрес PSP . Загрузка COM-программыВ процессе загрузки com-программы операционная система выполняет следующие действия:
Загрузка EXE-программыЗагрузка exe-программы происходит значительно сложнее, так как связана с настройкой сегментных адресов:
size = ((file_size * 512) - (hdr_size * 16) - part_pag
START_OFF = hdr_size * 16;
START_SEG = <сегментный адрес PSP > + 10h;
- считывается содержимое элемента таблицы как два двухбайтных слова (OFF, SEG); - вычисляется сегментный адрес ссылки перемещения по формуле: REL_SEG = (START_SEG + SEG) - выбирается слово по адресу 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 (команда возврата из дальней процедуры). |