Системное программное обеспечение персональных ЭВМ


11.1. Программный сегмент и программный идентификатор - часть 3


DOS, начиная с версии 3.30, поддерживает эти операции функцией 0x67, которая выделяет память для новой JFT (требуемый размер JFT задается в BX), копирует в выделенную область старую JFT и исправляет поля PSP. Следует иметь в виду, что даже если в CONFIG.SYS значение параметра FILES больше 20, JFT в PSP формируется все равно 20-байтной, и программа сама должна позаботиться о ее расширении. Действия по увеличению размера JFT являются необходимыми, но не всегда достаточными для снятия ограничения на число открытых файлов - возможно, для этого еще потребуется расширить системную таблицу файлов (см. главу 13). Непреодолимым ограничением представляется размер элемента JFT - 1 байт, который позволяет представить число от 0 до 254 (255 - признак свободного элемента). Трудно, впрочем, представить себе программу, в которой необходимо иметь одновременно открытыми 250 файлов.

Вернемся к описанию формата PSP. Еще 36 бит, следующих за полями, описанными struct PSP, отводятся для двух блоков FCB, которые DOS строит для файлов, имена которых, возможно, являются параметрами программы.

Остальные 128 байт PSP - неформатированная его часть. При вызове программы в ней, начиная со второго ее байта, располагается остаток командной строки - часть строки вызова после имени программы, то есть, параметры, переданные программе при вызове. Эта строка не закрывается кодом 0, поэтому первый байт неформатированной области содержит число символов в остатке командной строки. Неформатированная область PSP после загрузки программы назначается DOS в качестве исходной DTA загруженной программы.

Программа может получить доступ к своему PSP либо из начального содержимого регистров DS или ES, либо при помощи функций DOS 0x51 или 0x62 (обе функции возвращают в BX сегментный адрес PSP). По некоторым источникам функция 0x51 (и родственная ей 0x50) в версиях DOS до 3.0 работала не во всех ситуациях надежно, функция же 0x62 является документированной. Мы в наших примерах используем обе эти функции.

После всего, сказанного выше, программа примера 11.1 не нуждается в комментариях.Эта программа извлекает из своего PSP всю или почти всю полезную информацию. Читатель может усовершенствовать ее, добавив в struct PSP описание полей блоков FCB. Иллюстрация обращения к остатку командной строки есть в примере 11.5.




- Начало -  - Назад -  - Вперед -