Program Segment Prefix

Program Segment Prefix (с англ. — «Префикс программного сегмента», сокращённо PSP) — структура данных, которая используется в операционных системах семейства DOS и CP/M для сохранения состояния компьютерных программ.

PSP в DOS имеет следующую структуру:

Offset (Смещение)Size (Размер)Contents (Содержание)
00-012 байта (код)Содержит код INT 20 выхода из программы в стиле CP/M (для совместимости)
02-03машинное слово (2 байта)Сегмент, расположенный сразу после выделенной программе памяти
04байтЗарезервировано
05-095 байтов (код)Содержит код CALL FAR для вызова функций DOS в стиле CP/M (для совместимости)
0A-0Ddword (4 байта)Адрес обработчика Terminate предыдущей программы (предыдущий INT 22)
0E-11dwordАдрес обработчика Break предыдущей программы (предыдущий INT 23)
12-15dwordАдрес обработчика критических ошибок предыдущей программы (предыдущий INT 24)
16-17машинное словоСегмент PSP вызывающего процесса (как правило, command.com — внутренний)
18-2B20 байтen:Job File Table (внутренняя)
2C-2Dмашинное словоСегмент переменных среды
2E-31dwordSS:SP на входе к последнему вызову INT 21 (внутренний)
32-33машинное словомаксимальное количество открытых файлов (внутренний — см. ниже)
34-37dwordАдрес ручных записей (внутренний — см. ниже)
38-4F24 байтаЗарезервировано
50-523 байта (код)Для вызова к DOS (всегда содержит INT 21 + RETF)
53-5B9 байтЗарезервировано
5C-6B16 байтЗакрытый уровень FCB 1
6C-7F20 байтЗакрытый уровень FCB (перезаписан, если FCB 1 открыт)
801 байтКоличество символов в командной строке
81-FF127 байтКомандная строка (завершается 0Dh)

PSP (Zero-Page или Base Page) в CP/M-86

Offset (Смещение)Size (Размер)Contents (Содержание)
00-023 байтаДлина кодовой группы в байтах
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, bxmov   bl, [80h]mov   byte [bx + 81h], '$'; вывод строкиmov   ah, 9mov   dx, 81hint   21h; завершениеmov   ax, 4C00hint   21h

Примечания

Ссылки