Младшие адреса
Рис.6.2. Распределение памяти для загруженной программы
Для этого нужно определить начало области данных в файле. В заголовке файла не предусмотрено никакой информации о начальном значении регистра DS, в котором хранится сегмент данных. Перед передачей управления программе загрузчик устанавливает значение этого регистра так, чтобы он указывал на начало так называемого префикса программного сегмента [PSP}, а запущенная программа уже сама должна установить его надлежащим образом.
Префикс программного сегмента имеет длину 256 байт (16 параграфов) и размещается загрузчиком в оперативной памяти непосредственно перед загруженной программой. В PSP содержится различная служебная информация, которая может быть достаточно важной для ДОС и работающей программы (в PSP, например, хранятся параметры обращения к программе), но в нем нет указаний на содержимое регистра D5. Таким образом, найти начало области данных в файле достаточно трудно. Однако это нетрудно сделать в работающей программе — для этого предусмотрена стандартная функция DSegr, возвращающая сегмент данных. Если бы программа могла получить также информацию о сегменте PSP, с которого начинается загруженная программа, можно было бы вычислить смещение в файле от его начала до начала области данных. Такая возможность есть — функция MS-DOS с номером $62 возвращает в регистре ВХ значение сегмента Р5Р. Следовательно, программа должна получить значения обоих сегментов, вычислить их разницу и таким образом определить место в файле, с которого начинается область данных.
Остается последняя проблема — как найти нужную константу. Турбо Паскаль размещает константы в области данных по мере их объявления в