50 | 3 | Прерывание диспетчера функций. Содержит код
| | для прерывания int 21h вызова диспетчера фун-
| | кций MS-DOS, следующего по выходу far RET.
________|________|______________________________________________
53 | 2 | Зарезервировано.
________|________|______________________________________________
55 | 7 | Расширение блока управления файлом. Поля рас-
| | ширения для блока #1 управления файлом. Уста-
| | ревшее использование. Программы должны ис-
| | пользовать вместо описателя файла. Для полу-
| | чения более подробной информации по FCB (File
- 3-17 -
________________________________________________________________
Шестнадцатиричные|
-----------------| Содержимое
смещение| размер |
________|________|______________________________________________
| | control block - блок управления файлом) обра-
| | титесь к руководствам по MS-DOS).
________|________|______________________________________________
5C | 10 | Блок управления файлом номер 1. Содержит не-
| | открытый блок FCB #1. Устаревшее использова-
| | ние и в результате может привести к разруше-
| | нию FCB #2 и длины командной строки. Пути
| | имен файлов не поддерживаются. Вместо этого
| | программы должны использовать описатели фай-
| | лов. Для получения более подробной информации
| | по FCB, обратитесь к руководствам по MS-DOS.
________|________|______________________________________________
6C | 10 | Блок управления файлом номер 2. Содержит не-
| | открытый блок FCB #2. Устаревшее использова-
| | ние и в результате может привести к разруше-
| | нию параметров командной строки. Вместо это-
| | го программы должны использовать описатели
| | файлов. Для получения более подробной инфор-
| | мации по FCB, обратитесь к руководствам по
| | MS-DOS.
________|________|______________________________________________
7C | 4 | Зарезервировано.
________|________|______________________________________________
80 | 80 | Дисковая область передачи, назначаемая по
| | умолчанию. Перекрывает при использовании
| | строку текста командной строки.
________|________|______________________________________________
80 | 1 | Длина командной строки. Длина текстовой стро-
| | ки, которая была набрана следом за именем
| | программы, минус любые переназначенные симво-
| | лы или параметры.
________|________|______________________________________________
81 | 7F | Буфер командной строки. Текстовая строка, ко-
| | торая была введена следом за именем программы.
| | Символы переназначения (< и >) и их соответст-
| | вующие имена файлов в этой области не появля-
| | ются, т.к. переназначение прозрачно для прик-
| | ладной программы.
________|________|______________________________________________
Открытые описатели сохраняют свои показания в таблице файлов
системы. Неиспользуемые элементы в таблице помечаются шестнадцати-
ричным значением 0FF. Первые пять обработок в таблице описателей
файлов зарезервированы за стандартными устройствами: STDIN (стан-
дартный ввод), STDOUT (стандартный вывод), STDERR (стандартная
ошибка), AUXIO (вспомогательный ввод-вывод) и LSTOUT (стандартный
вывод на печать) и открываются при запуске процесса. Все показания
отсчитываются от первоначального нулевого значения.
Рис.3-8 показывает состояние таблицы описателя файла, приня-
той по умолчанию, сразу же после успешного открытия файла myfile
(мой файл). Таблица описателя файла, принимаемая по умолчанию,
является двадцатибайтовой таблицей, размещенной в PSP по смеще-
нию 18 (шестнадцатиричное значение). Этот адрес запоминается в
- 3-18 -
адресе таблицы описателя при запуске процесса. В связи с тем,
что первые пять обработок зарезервированы за стандартными уст-
ройствами, остается только 15 обработок, доступных для файлов или
других устройств.
.00h-----------02h-------------------05h-----------------------.
|int 20h |Вершина памяти | 00 | Далекий вызов MS-DOS |
-------------|0Ah----------------------0Eh--------------------|
|Адрес завершения |Адрес выхода Ctrl-Break|
|12h---------------------|16h--------------------
|Адр.вых. по крит. ошибке|PSP владельца|
.18h-------------------------------------------------|
|Таблица описателя файла |
|----------------------------------------------------|
|Таблица описателя файла (продолжение) |
|-------------------------------2Ch-----2Eh--------------------.
|Таблица описателя файла(конец)|Среда |Начальный адрес стека |
--------------32h-------------|34h----------------------------
|Счетчик описат. |Указатель таб.описат.|
.38h-------------------------------------------------|
|Зарезервированная область (длиной 40 байт) |
----------------------------------------------------
.50h-----------------53h----------55h----------------.
|Функция int 21h |Зарезерв. |Расширение FCB |
|----------------------------5Ch---------------------|
|Расширение FCB(продолжение)|Блок управл-я файлом #1 |
|----------------------------------------------------|
|Блок управления файлом #1 (продолжение) |
|----------------------------6Ch---------------------|
|Блок управления файлом #1 |Блок управл-я файлом #2 |
|----------------------------------------------------|
|Блок управления файлом #2 (продолжение) |
|----------------------------7Ch---------------------|
|Блок управления файлом #2 |Зарезервированная обл. |
|80Ch-81Ch-------------------------------------------|
|Дл. |Буфер команд (длиной 127 байт) |
----------------------------------------------------
Рис.3-7. Структура PSP
На Рис.3-8 значение описателя, возвращаемое при успешном вы-
полнении функции OPEN, равно 0005, которое означает, что файлу с
именем myfile назначен шестой элемент (вход) в таблице описате-
ля файлов процесса. При обращении шестой вход содержит значение
03, которое означает, что файлу myfile был назначен четвертый
вход в таблице файлов системы. Рис.3-8 также демонстрирует ис-
пользование первых трех описателей с целью показа назначения
для одного и того же входа в системной таблице файлов нескольких
обработок. Максимальное количество входов в системную таблицу
файлов устанавливается с помощью предложения FILES = в файле кон-
фигурации системы CONFIG.SYS.
- 3-19 -
.34h----------------------------. .--------------.
| Указатель таблицы описателя | | Описатель AX |
| PS Segment:0018 (шестнадц.) | | OPEN = 0005 |
------------------------------- --------------
| |
-------------------------------
|
0 1 2 3 4 5 v 6 7
.-------------------------------------------------------.
|18h | | | | |Таб.описател.файлов |
| STDIN|STDOUT|STDERR| AUXIO|LSTOUT|myfile|(не использ.)|
| 01 | 01 | 01 | 00 | 02 | 03 | FF | FF |
-------------------------------------------------------
| | | | | |
|------------- | | |
|Табл. файлов системы| | |
| .--------------. | | |
| | AUX 0 |<- | |
| |--------------| | |
->| CON 1 | | |
|--------------| | |
| PRN 2 |<-------- |
|--------------| |
| MYFILE 3 |<---------------
|--------------|
|Не использ.4 |
--------------
Рис.3-8. Таблица описателей файлов PSP
В большинстве ситуаций пользователю никогда нет необходимости
быть осведомленным об этих устройствах, однако, существуют две
ситуации, когда эти знания полезны.
Первая ситуация возникает, когда программа пользователя тре-
бует больше описателей, чем может быть открыто в данное время.
Так как по умолчанию таблица описателей файлов поддерживает толь-
ко 20 описателей и т.к. 5 описателей уже присвоены, то практичес-
ки невозможно так далеко все предугадать. Тем не менее, чтобы
обойти это ограничение, программа должна установить свои собс-
твенные расширенные таблицы описателей файлов, как показано во
фрагменте программы в листинге 3-2.
При второй ситуации листинг 3-2 предполагает, что для прог-
раммы использовано размещение новой таблицы и, кроме того, пред-
полагает, что таблица была предварительно загружена с кодами 0FF
(коды неиспользуемых описателей). Программа сначала определяет
ячейки PSP, используя функцию 62h. Из PSP находится размер и
ячейки существующей таблицы описателей файлов, и старая таблица
копируется в новую таблицу. Новый адрес таблицы и ее размер сох-
раняются в соответствующих полях PSP и обмен завершается.
Другой возможностью, предоставляемой этим механизмом, являет-
ся то, что программист теперь управляет переназначением ввода и
вывода программы. В MS-DOS переназначение выполняется простым из-
менением драйвера, связанного с конкретным устройством. Этот спо-
соб даже работает для переназначения ввода и вывода, выполняемого
со старыми, необрабатываемыми вызовами ввода и вывода (такими как
функция 09h "Отобразить строку").
Листинг 3-3 демонстрирует как устройство stdout (стандартный
- 3-20 -
вывод) переназначается в файл или устройство myfile (мой файл).
Программа сначала открывает имя myfile и сохраняет описатель. За-