Префикс сегмента программы - Program Segment Prefix
В Префикс сегмента программы (PSP) - это структура данных, используемая в ДОС системы для хранения состояния программа. Он напоминает Нулевая страница в CP / M Операционная система. PSP имеет следующую структуру:
Offsetimages | Размер | Содержание |
---|---|---|
00ч-01ч | 2 байта (код) | CP / M-80 -подобный выход (всегда содержит ИНТ 20ч )[1] |
02ч-03ч | слово (2 байта) | Сегмент первого байта за пределами памяти, выделенной программе |
04ч | байт | Зарезервированный |
05–09 | 5 байт (код) | CP / M-80-подобный вход удаленного вызова в DOS и размер сегмента программы[1][2] |
0Ah-0Dh | dword (4 байта) | Завершить адрес предыдущей программы (старый ИНТ 22ч ) |
0Eh-11h | dword | Адрес разрыва предыдущей программы (старый ИНТ 23ч ) |
12ч-15ч | dword | Адрес критической ошибки предыдущей программы (старый ИНТ 24ч ) |
16ч-17ч | слово | Сегмент PSP родителей (обычно COMMAND.COM - внутренний) |
18ч-2ч | 20 байт | Таблица файлов заданий (JFT) (внутренний) |
2Ч-2Дч | слово | Среда сегмент |
2Eh-31h | dword | SS: SP от входа до последнего ИНТ 21ч звонок (внутренний) |
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 программы загружены со смещением 100ч, можно напрямую обратиться к PSP, просто используя смещения, перечисленные выше. Компенсировать 000ч указывает на начало PSP, 0FFh указывает до конца и т. д.
Например, следующий код отображает аргументы командной строки:
орг 100ч ; .COM - без использования ds; Подфункция 9 INT 21h требует '$' для завершения строкиxor bx,bxmov бл,[80ч]cmp бл,7Eh я выход ; предотвращение переполненияmov байт [bx+81ч],'$'; распечатать строкуmov ах,9mov dx,81чint 21чвыход:mov топор,4C00h ; подфункция 4Cint 21ч
В DOS 1.x регистр CS (сегмент кода) должен был содержать тот же сегмент, что и PSP при завершении программы, поэтому стандартная практика программирования включала сохранение регистра DS в стек при запуске программы (поскольку регистр DS является загружается с сегментом PSP) и завершает программу инструкцией RETF, которая выталкивает сохраненное значение сегмента из стека и переходит к адресу 0 PSP, который содержит инструкцию INT 20h.
; спаститолкать dsxor топор,топортолкать топор; перейти в группу данных по умолчанию (@data)mov топор,@данныеmov ds,топор; распечатать сообщение в mess1 (21h подфункция 9)mov dx,беспорядок1mov ах,9int 21чretf
Если исполняемый файл был файлом .COM, в этой процедуре не было необходимости, и программу можно было завершить просто с помощью прямой инструкции INT 20h или другого вызова функции INT 21h 0. Однако программист все равно должен был убедиться, что регистр CS содержит адрес сегмента. PSP при завершении программы. Таким образом,
jmp Начнитебеспорядок1 db 'Привет, мир! $'Начните:mov dx,беспорядок1mov ах,9int 21чint 20ч
В DOS 2.x и выше завершение программы выполнялось с помощью INT 21h, Function 4Ch, которая не требовала, чтобы регистр CS содержал значение сегмента PSP.
Смотрите также
- Нулевая страница (CP / M)
- ЗВОНОК 5 (DOS)
- Рамка стека (Unix)[6]
- Каталог процессов (Мультики)[6]
- Идентификатор процесса (PID)[6]
- это (компьютерное программирование)
- Самостоятельная ссылка
Рекомендации
- ^ а б Тейлор, Роджер; Леммонс, Фил (июнь 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. Получено 2020-01-15.
[…] Получение доступа к CP / M-86 […] Получение доступа к CP / M-86 требует помещения кода функции в регистр CL, помещения параметра байта в регистр DL или помещения параметра слова в регистр DX, помещения сегмента данных в регистр DS (данные сегмент обычно не изменяется для преобразованной программы), и выполнение программного прерывания, ИНТ # 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 имеет "предпочтительный" механизм программных прерываний, ИНТ # 33 для доступа к системе предоставляется дополнительный механизм для «уже существующих» программ, который совместим с соглашениями о вызовах CP / M-80, по крайней мере, для функций в диапазоне 0-36. Что касается системных вызовов в допустимом диапазоне функций, программисту не нужно ничего делать с транслированными программами, чтобы заставить их работать под MS-DOS, кроме как правильно отображать регистры. MS-DOS также поддерживает функцию горячей загрузки CP / M-80. Переход к позиции 0 в MS-DOS вызывает программное прерывание, ИНТ # 32, который функционально является окончанием программы и обычным способом выхода из программы. […]
[1] [2][3][4][5][6][7][8][9][10][11][12][13][14] (13 стр.) - ^ Некасек, Михал (13 сентября 2011). "Кому вообще нужен перенос адреса?". OS / 2 музей. В архиве из оригинала на 2020-02-19. Получено 2020-02-19.
[…] 86-ДОС, и поэтому ПК DOS /MS-DOS, использовал хитрый трюк. Байт по смещению 5 PSP содержал код операции удаленного вызова (9Ah); слово со смещением 6 PSP содержало соответствующее значение, указывающее размер сегмента программы, а также смещение части дальнего вызова. Слово со смещением 8, которое служило сегментной частью удаленного вызова, было создано таким образом, что в сочетании со смещением оно оборачивается (хорошо понимаемая особенность 8086 CPU) и укажите адрес 0: C0h, который содержит вектор прерывания 30h. […] ЗВОНОК 5 интерфейс работает даже в эмуляции DOS под Windows NT и OS / 2, и эти системы наверняка не могут работать с Линия A20 отключен. Как тогда это работает? […] Вместо того, чтобы отсекать адресные биты, система отражает пять байтов в 0: C0h в 1000C0h. Тот же метод фактически использовался в DOS 5 и выше, работающих с DOS = ВЫСОКИЙ. В этом случае DOS гарантирует, что линейный адрес 1000C0h содержит соответствующий удаленный вызов. […]
- ^ Пол, Маттиас Р. (1997-07-01) [1994-01-01]. MSDOSTIPs - Советы по использованию MS-DOS 5.0-7. MPDOSTIP (на немецком). В архиве из оригинала от 22.08.2017. Получено 2013-10-25. (NB. MSDOSTIP.TXT является частью MPDOSTIP.ZIP, поддерживался до 2001 года и распространялся на многих сайтах того времени. Приведенная ссылка указывает на более старую версию файла MSDOSTIP.TXT, преобразованную в HTML.) [15]
- ^ Пол, Матиас Р. (1997-05-01) [1995-03-01]. "Рекомендации по JPSofts 4DOS 5.5b / c, 5.51, 5.52a и NDOS". MPDOSTIP (на немецком). В архиве из оригинала от 04.11.2016. Получено 2015-05-08. (NB. Данная ссылка указывает на HTML-конвертированную версию
4DOS5TIP.TXT
файл, который является частьюMPDOSTIP.ZIP
коллекция.) [16] - ^ «INT 21h, 62h - Получить адрес PSP (DOS 3.x)». Архивировано из оригинал на 2012-02-07.
- ^ а б c Шульман, Эндрю; Браун, Ральф Д.; Макси, Дэвид; 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 (Предварительная ред.). Сиэтл, Вашингтон, США: Сиэтл Компьютерные Продукты, Inc. 1980. Архивировано с оригинал (PDF) на 2019-06-23. Получено 2011-09-13. (41 стр.)
- «Формат префикса сегмента программы (PSP)». INTER61. 2000. В архиве из оригинала на 17.02.2020. Получено 2019-12-19.
- Шеперс, Арне (1991). "Kapitel 5: EXEC im Detail - Program Segment Prefix (PSP)". DOS 5 для программиста: Die endgültige Referenz (на немецком языке) (1-е изд.). Addison Wesley (Deutschland) GmbH. С. 148–151, 971–972. ISBN 3-89319-350-2. (1123 + V страниц, складной, 5,25 "-флоппи)
внешняя ссылка
- Доступ к аргументам командной строки (Microsoft.com)