|
|
|
|
Сегмент программного префикса (PSP)
Когда DOS загружает программу, он создает сегмент префикса программы. В предыдущей главе описаны многие из полей PSP. DOS всегда помещает PSP на
шестнадцатибайтовую границу параграфа, так что он может быть описан, как значение длиной в слово (сегмент, а смещение ноль). Команда DOS 62h возвращает
адрес текущего PSP в регистре BX (недокументированная функция AH=51h также возвращает PSP в BX).
Листинг 4-15 показывает структуру PSP. Поля PSP PSP_D_JFTAddr и PSP_W_JFTSize содержат адрес и размер рабочей таблицы файлов
(JFT). PSP содержит также копию (по умолчанию) JFT, начинающуюся с JFT_T_JFT. DOS использует некоторые другие поля PSP для обработки критических
ошибок и запроса завершения; подробнее об этих полях позднее.
Листинг 4-15. Структура PSP
----------------------------------------------------------------
PSP STRUC
PSP_W_int20 DW 0cd20h ; [00] команда int 20
PSP_W_MemSiz DW 0 ; [02] начало памяти (para)
PSP_B_Unused0 DB 0 ; [04] неизвестно
PSP_T_Call DB 09aH,0f0h ; [05] дальний вызов DOS
DB 0feH,01dh,00f0h ; диспетчер (CPM relic)
PSP_D_Term DD 0 ; [0a] конечный адрес
PSP_D_Break DD 0 ; [0e] адрес прерывания
PSP_D_CritErr DD 0 ; [12] критическая ошибка
PSP_W_Parent DW 0 ; [16] родительский PSP
PSP_T_JFT DB 14h DUP 90ffn) ; [18] таблица JFT
PSP_W_Envron DW 0 ; [2c] окружение
PSP_D_SSSP DD 0 ; [2e] SS:SP пользователя на
; время int 21
PSP_W_JFTSize DW 14h ; [32] размер JFT
PSP_D_JFTAddr DD 0 ; [34] адрес JFT
PSP_D_NextPSP DW 0ffffH,0ffffh ; [38] не применяется
PSP_T_Unused2 DB 14h DUP (0) ; [3c] не применяется
PSP_W_Int21 DW 0cd21h ; [50]
PSP_B_Retf DB 0 ; [52]
PSP_T_Unused3 DB 9 DUP (0) ; [53]
PSP_T_Parm1 DB 10h DUP (0) ; [5c] форматировано param 1
PSP_T_Parm2 DB 14h DUP (0) ; [6c] форматировано param 2
PSP_T_DTA DB 80h DUP (0) ; [80] по умолчанию DTA
PSP ENDS
----------------------------------------------------------------
|
|
|