- Program Segment Prefix
-
Program Segment Prefix (рус. Префикс программного сегмента, PSP) — структура данных, которая используется в операционных системах семейства DOS и CP/M для сохранения состояния компьютерных программ.
PSP в DOS имеет следующую структуру:
Offset (Смещение) Size (Размер) Contents (Содержание) 00-01 2 байта (код) Выход CP/M (всегда содержит INT 20) 02-03 машинное слово (2 байта) Объем оперативной памяти в пунктах 04 байт Зарезервировано 05-09 5 байтов (код) Дальний вызов совместимости кода CP/M в DOS 0A-0D dword (4 байта) Завершить адреса предыдущей программы (устаревший INT 22) 0E-11 dword Прервать адреса предыдущей программы (устаревший 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 в момент исполнения программы. Также он может быть позже определён через использование прерывания №21 подфункции №62. Это прерывание возвратит адрес 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
Примечания
- ↑ INT 21,62 - Get PSP address (DOS 3.x). Архивировано из первоисточника 27 апреля 2012.
Внешние ссылки
- Accessing Command Line Arguments (База знаний Microsoft)
Категория:- DOS
Wikimedia Foundation. 2010.