Program Segment Prefix

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 Word Address of the password for the first FCB (CP/M 3)
53 Byte Length of the password for the first FCB (CP/M 3)
54-55 Word Address of the password for the second FCB (CP/M 3)
56 Byte Length of the password for the second FCB (CP/M 3)
57-5B Bytes Reserved
5C-6B Default FCB 1
6C-7F Default FCB 2 (overwritten if FCB 1 is opened)
80 Byte Количество символов в командной строке
81-FF Bytes Командная строка

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 subfunction 9 requires '$' to terminate string
xor   bx, bx
mov   bl, [80h]
mov   byte [bx + 81h], '$'

; print the string
mov   ah, 9
mov   dx, 81h
int   21h

; exit
mov   ax, 4C00h
int   21h

Примечания

  1. INT 21,62 - Get PSP address (DOS 3.x) (недоступная ссылка). Архивировано 26 апреля 2012 года.

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.