Program Segment Prefix (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 | машинное слово | 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
Примечания
[править | править код]- ↑ INT 21,62 - Get PSP address (DOS 3.x) . Архивировано из оригинала 26 апреля 2012 года.
Ссылки
[править | править код]- Accessing Command Line Arguments (База знаний Microsoft)