Program Segment Prefix
Program Segment Prefix (рус. Префикс программного сегмента, PSP) — структура данных, которая используется в операционных системах семейства DOS и CP/M для сохранения состояния компьютерных программ. PSP имеет следующую структуру:
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 наиболее часто используется для получения аргументов из командной строки программой под 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
Примечания
Внешние ссылки
- Accessing Command Line Arguments (База знаний Microsoft)