Program Segment Prefix (с англ. — «Префикс программного сегмента», сокращённо PSP) — структура данных, которая используется в операционных системах семейства DOS и CP/M для сохранения состояния компьютерных программ.
PSP в DOS имеет следующую структуру:
Подробнее Offset (Смещение), Size (Размер) ...
| 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 (Размер) ...
| 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