Program Segment Prefix (с англ. — «Префикс программного сегмента», сокращённо PSP) — структура данных, которая используется в операционных системах семейства DOS и CP/M для сохранения состояния компьютерных программ.
PSP в DOS имеет следующую структуру:
Offset (Смещение)
|
Size (Размер)
|
Contents (Содержание)
|
00-01
|
2 байта (код)
|
Содержит код INT 20 выхода из программы в стиле CP/M (для совместимости)
|
02-03
|
машинное слово (2 байта)
|
Сегмент, расположенный сразу после выделенной программе памяти
|
04
|
байт
|
Зарезервировано
|
05-09
|
5 байтов (код)
|
Содержит код CALL FAR для вызова функций DOS в стиле CP/M (для совместимости)
|
0A-0D
|
dword (4 байта)
|
Адрес обработчика Terminate предыдущей программы (предыдущий INT 22)
|
0E-11
|
dword
|
Адрес обработчика Break предыдущей программы (предыдущий INT 23)
|
12-15
|
dword
|
Адрес обработчика критических ошибок предыдущей программы (предыдущий INT 24)
|
16-17
|
машинное слово
|
Сегмент PSP вызывающего процесса (как правило, command.com — внутренний)
|
18-2B
|
20 байт
|
en:Job File Table (внутренняя)
|
2C-2D
|
машинное слово
|
Сегмент переменных среды
|
2E-31
|
dword
|
SS:SP на входе к последнему вызову INT 21 (внутренний)
|
32-33
|
машинное слово
|
максимальное количество открытых файлов (внутренний — см. ниже)
|
34-37
|
dword
|
Адрес ручных записей (внутренний — см. ниже)
|
38-4F
|
24 байта
|
Зарезервировано
|
50-52
|
3 байта (код)
|
Для вызова к DOS (всегда содержит INT 21 + RETF)
|
53-5B
|
9 байт
|
Зарезервировано
|
5C-6B
|
16 байт
|
Закрытый уровень FCB 1
|
6C-7F
|
20 байт
|
Закрытый уровень FCB (перезаписан, если FCB 1 открыт)
|
80
|
1 байт
|
Количество символов в командной строке
|
81-FF
|
127 байт
|
Командная строка (завершается 0Dh)
|
PSP (Zero-Page или Base Page) в CP/M-86
Offset (Смещение)
|
Size (Размер)
|
Contents (Содержание)
|
00-02
|
3 байта
|
Длина кодовой группы в байтах
|
03-04
|
машинное слово
|
Адрес сегмента кодовой группы
|
05
|
Байт
|
Флаг модели 8080 — установлен, если программа в одном сегменте
|
06-08
|
машинное слово
|
Длина группы данных в байтах
|
09-0A
|
машинное слово
|
Адрес сегмента группы данных
|
0B
|
Байт
|
Зарезервировано
|
0C-11
|
|
Дескриптор дополнительной группы — формат как для группы данных
|
12-17
|
|
Дескриптор группы стека — формат как для группы данных
|
18-1D
|
|
Дескриптор группы X1 — формат как для группы данных
|
1E-23
|
|
Дескриптор группы X2 — формат как для группы данных
|
24-29
|
|
Дескриптор группы X3 — формат как для группы данных
|
2A-2F
|
|
Дескриптор группы X4 — формат как для группы данных
|
30-4F
|
|
Зарезервировано
|
50
|
Байт
|
Диск, с какого была загружена программа (CP/M 3)
|
51-52
|
машинное слово
|
Address of the password for the first FCB (CP/M 3)
|
53
|
Байт
|
Length of the password for the first FCB (CP/M 3)
|
54-55
|
машинное слово
|
Address of the password for the second FCB (CP/M 3)
|
56
|
Байт
|
Length of the password for the second FCB (CP/M 3)
|
57-5B
|
Байты
|
Зарезервированно
|
5C-6B
|
|
Дефолт FCB 1
|
6C-7F
|
|
Дефолт FCB 2 (перезаписывается, если открыт CB 1)
|
80
|
Байт
|
Количество символов в командной строке
|
81-FF
|
Байты
|
Командная строка
|
PSP наиболее часто используется для получения аргументов из командной строки программой под DOS, например, команда «foo.exe -a -f» исполнит (запустит) файл foo.exe с аргументами '-a' и '-f'.
Сегментный адрес PSP будет занесён в регистр DS в момент исполнения программы. Также он может быть позже определён через использование прерывания № 21h подфункции № 62h. Это прерывание возвратит адрес PSP в регистр BX.[1]
Кроме этого, в .COM-программах можно обратиться непосредственно к PSP только при помощи смещений в списке выше. 00h указывает на начало PSP, FFh указывает на конец, и т. д. Например, следующий код отображает аргументы командной строки:
org 100h
; int 21h подфункция 9 требует '$' для завершения строки
xor bx, bx
mov bl, [80h]
mov byte [bx + 81h], '$'
; вывод строки
mov ah, 9
mov dx, 81h
int 21h
; завершение
mov ax, 4C00h
int 21h
Примечания
Ссылки