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)
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.