Сегмент программы Prefix (PSP) является структурой данных , используемой в DOS системах для хранения состояния программы . Он напоминает нулевую страницу в операционной системе CP / M. PSP имеет следующую структуру:
Offsetimages | Размер | СОДЕРЖАНИЕ |
---|---|---|
00ч-01ч | 2 байта (код) | Выход, подобный CP / M-80 (всегда содержит INT 20h ) [1] |
02ч-03ч | слово (2 байта) | Сегмент первого байта за пределами памяти, выделенной программе |
04ч | байт | Зарезервированный |
05–09 | 5 байт (код) | Вход удаленного вызова в DOS, как у CP / M-80 , и размер сегмента программы [1] [2] |
0Ah-0Dh | dword (4 байта) | Завершить адрес предыдущей программы (старый INT 22h ) |
0Eh-11h | dword | Адрес разрыва предыдущей программы (старый INT 23h ) |
12ч-15ч | dword | Адрес критической ошибки предыдущей программы (старый INT 24h ) |
16ч-17ч | слово | Сегмент PSP родителя (обычно COMMAND.COM - внутренний) |
18ч-2чч | 20 байт | Таблица файлов заданий (JFT) (внутренняя) |
2Ч-2Дч | слово | Сегмент окружающей среды |
2Eh-31h | dword | SS: SP при входе в последний вызов INT 21h (внутренний) |
32ч-33ч | слово | Размер JFT (внутренний) |
34ч-37ч | dword | Указатель на JFT (внутренний) |
38ч-3Бч | dword | Указатель на предыдущую PSP (используется только SHARE в DOS 3.3 и новее) |
3Ч-3Фх | 4 байта | Зарезервированный |
40ч-41ч | слово | Версия DOS для возврата (DOS 4 и новее, можно изменить с помощью SETVER в DOS 5 и новее) |
42ч-4Фч | 14 байт | Зарезервированный |
50ч-52ч | 3 байта (код) | Unix- подобный вход удаленного вызова в DOS (всегда содержит INT 21h + RETF) |
53ч-54ч | 2 байта | Зарезервированный |
55h-5Bh | 7 байтов | Зарезервировано (может использоваться для преобразования первого FCB в расширенный FCB) |
5Ч-6Бх | 16 байт | Закрытый стандарт FCB 1 |
6Ч-7Фх | 20 байт | Неоткрытый стандартный FCB 2 (перезаписывается, если FCB 1 открыт) |
80ч | 1 байт | Количество байтов в командной строке |
81h-FFh | 127 байт | Хвост командной строки (завершается 0Dh ) [3] [4] |
PSP чаще всего используется для получения аргументов командной строки программы DOS; например, команда «FOO.EXE / A / F» выполняет FOO.EXE с аргументами «/ A» и «/ F».
Если запись PSP для длины командной строки не равна нулю, а указатель на сегмент среды не равен ни 0000h, ни FFFFh, программы должны сначала попытаться получить командную строку из переменной среды % CMDLINE%, прежде чем извлекать ее из PSP. Таким образом, можно передавать приложениям командные строки длиной более 126 символов.
Сегментный адрес PSP передается в регистр DS при выполнении программы. Это также можно определить позже, используя функцию Int 21h 51h или функцию 62h Int 21h. Любая функция вернет адрес PSP в регистре BX. [5]
В качестве альтернативы, в программах .COM , загруженных со смещением 100h , можно напрямую обращаться к PSP, просто используя смещения, перечисленные выше. Смещение 000h указывает на начало PSP, 0FFh указывает на конец и т. Д.
Например, следующий код отображает аргументы командной строки:
org 100h ; .COM - без использования ds; Подфункция 9 INT 21h требует '$' для завершения строки xor bx , bx mov bl , [ 80h ] cmp bl , 7Eh ja exit ; предотвращение переполненияmov byte [ bx + 81h ], '$'; напечатать строку mov ah , 9 mov dx , 81h int 21hвыход: mov ax , 4C00h ; подфункция 4C int 21h
В DOS 1.x было необходимо, чтобы регистр CS (сегмент кода) содержал тот же сегмент, что и PSP при завершении программы, поэтому стандартная практика программирования включала сохранение регистра DS в стек при запуске программы (поскольку регистр DS является загружается с сегментом PSP) и завершает программу инструкцией RETF, которая выталкивает сохраненное значение сегмента из стека и переходит к адресу 0 PSP, который содержит инструкцию INT 20h.
; сохранить push ds xor ax , ax push ax; перейти в группу данных по умолчанию (@data) mov ax , @ data mov ds , ax; напечатать сообщение в mess1 (21h подфункция 9) mov dx , mess1 mov ah , 9 int 21hretf
Если исполняемый файл был файлом .COM, в этой процедуре не было необходимости, и программу можно было завершить просто с помощью прямой инструкции INT 20h или другого вызова функции INT 21h 0. Однако программист все равно должен был убедиться, что регистр CS содержит адрес сегмента. PSP при завершении программы. Таким образом,
jmp startmess1 db 'Привет, мир! $'начало: mov dx , mess1 mov ah , 9 int 21hint 20h
В DOS 2.x и выше завершение программы выполнялось вместо этого с помощью INT 21h Function 4Ch, которая не требовала, чтобы регистр CS содержал значение сегмента PSP.
Смотрите также
- Нулевая страница (CP / M)
- ЗВОНОК 5 (DOS)
- Фрейм стека (Unix) [6]
- Каталог процессов (Multics) [6]
- Идентификатор процесса (PID) [6]
- это (компьютерное программирование)
- Самостоятельная ссылка
Рекомендации
- ^ a b Тейлор, Роджер; Леммонс, Фил (июнь 1982 г.). «Переход вверх - Часть 1: Переводчики - Использование программ перевода для переноса программ CP / M-86 в CP / M и MS-DOS» (PDF) . БАЙТ . Vol. 7 нет. 6. BYTE Publications Inc., стр. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN 0360-5280 . CODEN BYTEDJ . Архивировано (PDF) из оригинала на 2020-01-16 . Проверено 15 января 2020 .
[…] Получение доступа к CP / M-86 […] Получение доступа к CP / M-86 требует помещения кода функции в регистр CL, помещения параметра байта в регистр DL или помещения параметра слова в регистр DX, размещение сегмента данных в регистре DS (сегмент данных обычно не изменяется для преобразованной программы) и выполнение программного прерывания INT # 224 . Результат возвращается в регистр AL, если это байтовое значение; если результатом является значение слова, оно возвращается в регистры AX и BX. Значения двойного слова возвращаются со смещением в регистрах BX и сегментом в регистре ES. Таким образом, преобразование программ из CP / M-80 в CP / M-86 требует замены вызова в ячейку 5 программным прерыванием INT # 224. Еще одно необходимое изменение связано с теплой загрузкой . В CP / M-80 доступ к горячей перезагрузке можно получить с помощью системного вызова с кодом функции 0 для перехода к местоположению O. CP / M-86, однако, не поддерживает переход к местоположению O. В результате , вы должны изменить эту программу выхода в переведенной программе, чтобы программа работала правильно. При условии, что вызов местоположения 5 заменен на INT # 224, что выполнено изменение горячей загрузки и что регистры отображаются правильно, не должно возникнуть особых проблем с получением транслированной программы для доступа к системным функциям CP / M-86. . […] Получение доступа к MS-DOS […] Хотя MS-DOS имеет «предпочтительный» механизм через программное прерывание, INT # 33 , для доступа к системе, для «существующих» программ предоставляется дополнительный механизм, который совместим с соглашениями о вызовах CP / M-80, по крайней мере, для функций в диапазоне 0-36. Что касается системных вызовов в допустимом диапазоне функций, программисту не нужно ничего делать с транслированными программами, чтобы заставить их работать под MS-DOS, кроме как правильно отображать регистры. MS-DOS также поддерживает функцию горячей загрузки CP / M-80. Переход к позиции 0 в MS-DOS выполняет программное прерывание INT # 32 , которое функционально является концом программы и нормальным способом выхода из программы. […]
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] » (13 страниц)» - ^ Некасек, Михал (13 сентября 2011). "Кому вообще нужен перенос адреса?" . OS / 2 Музей . Архивировано 19 февраля 2020 года . Проверено 19 февраля 2020 .
[…] 86-DOS и, следовательно, PC DOS / MS-DOS , использовали хитрый трюк. Байт по смещению 5 PSP содержал код операции удаленного вызова (9Ah); слово со смещением 6 PSP содержало соответствующее значение, указывающее размер сегмента программы, а также смещение части дальнего вызова. Слово со смещением 8, которое служило сегментной частью удаленного вызова, было создано таким образом, что в сочетании со смещением оно оборачивается (хорошо понятная особенность процессора 8086 ) и указывает на адрес 0: C0h, который содержит вектор прерывания 30h. […] Интерфейс CALL 5 работает даже в эмуляции DOS под Windows NT и OS / 2, и эти системы определенно не могут работать с отключенной линией A20 . Как тогда это работает? […] Вместо того, чтобы отсекать адресные биты, система отражает пять байтов в 0: C0h в 1000C0h. Тот же метод фактически использовался в DOS 5 и выше, работающих с DOS = HIGH . В этом случае DOS гарантирует, что линейный адрес 1000C0h содержит соответствующий удаленный вызов. […]
- ^ Пол, Матиас Р. (1997-07-01) [1994-01-01]. MSDOSTIPs - Советы по использованию MS-DOS 5.0-7 . MPDOSTIP (на немецком языке). Архивировано 22 августа 2017 года . Проверено 25 октября 2013 .(NB. MSDOSTIP.TXT является частью MPDOSTIP.ZIP, поддерживался до 2001 года и распространялся в то время на многих сайтах. Приведенная ссылка указывает на преобразованную в HTML старую версию файла MSDOSTIP.TXT.) [15]
- ^ Пол, Матиас Р. (1997-05-01) [1995-03-01]. «Рекомендации по JPSofts 4DOS 5.5b / c, 5.51, 5.52a и NDOS» . MPDOSTIP (на немецком языке). Архивировано 4 ноября 2016 года . Проверено 8 мая 2015 .(NB. Приведенная ссылка указывает на HTML-конвертированную версию
4DOS5TIP.TXT
файла, которая является частьюMPDOSTIP.ZIP
коллекции.) [16] - ^ «INT 21h, 62h - Получить адрес PSP (DOS 3.x)» . Архивировано из оригинала на 2012-02-07.
- ^ а б в Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Michels, Raymond J .; Кайл, Джим (1994) [ноябрь 1993]. Недокументированная DOS: Руководство программиста по зарезервированным функциям и структурам данных MS-DOS - расширено за счет включения MS-DOS 6, Novell DOS и Windows 3.1 (2-е изд.). Ридинг, Массачусетс, США: Аддисон Уэсли . ISBN 0-201-63287-X. ISBN 978-0-201-63287-3 .(xviii + 856 + vi страниц, 3,5-дюймовый диск) Исправления: [17] [18]
дальнейшее чтение
- 86-DOS - Дисковая операционная система для 8086 - Руководство программиста (PDF) . Версия 0.3 (Предварительная ред.). Сиэтл, Вашингтон, США: Seattle Computer Products, Inc. 1980. Архивировано из оригинала (PDF) 23.06.2019 . Проверено 13 сентября 2011 . (41 стр.)
- «Формат префикса сегмента программы (PSP)» . INTER61 . 2000. Архивировано 17 февраля 2020 года . Проверено 19 декабря 2019 .
- Шеперс, Арне (1991). «Kapitel 5: EXEC im Detail - Program Segment Prefix (PSP)». DOS 5 für Programmierer: Die endgültige Referenz (на немецком языке) (1-е изд.). Addison Wesley (Deutschland) GmbH . С. 148–151, 971–972. ISBN 3-89319-350-2. (1123 + V страниц, складной, 5,25 "-флоппи)
Внешние ссылки
- Доступ к аргументам командной строки (Microsoft.com)