WikiDer > Префикс сегмента программы

Program Segment Prefix

В Префикс сегмента программы (PSP) - это структура данных, используемая в ДОС системы для хранения состояния программа. Он напоминает Нулевая страница в CP / M Операционная система. PSP имеет следующую структуру:

OffsetimagesРазмерСодержание
00ч-01ч2 байта (код)CP / M-80-подобный выход (всегда содержит ИНТ 20ч)[1]
02ч-03чслово (2 байта)Сегмент первого байта за пределами памяти, выделенной программе
04чбайтЗарезервированный
05–095 байт (код)CP / M-80-подобный вход удаленного вызова в DOS и размер сегмента программы[1][2]
0Ah-0Dhdword (4 байта)Завершить адрес предыдущей программы (старый ИНТ 22ч)
0Eh-11hdwordАдрес разрыва предыдущей программы (старый ИНТ 23ч)
12ч-15чdwordАдрес критической ошибки предыдущей программы (старый ИНТ 24ч)
16ч-17чсловоСегмент PSP родителей (обычно COMMAND.COM - внутренний)
18ч-2ч20 байтТаблица файлов заданий (JFT) (внутренний)
2Ч-2ДчсловоСреда сегмент
2Eh-31hdwordSS: 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-5Bh7 байтовЗарезервировано (можно использовать для преобразования первого FCB в расширенный FCB)
5Ч-6Бх16 байтЗакрытый стандарт FCB 1
6Ч-7Фх20 байтНеоткрытый стандартный FCB 2 (перезаписывается при открытии FCB 1)
80ч1 байтКоличество байтов в командной строке
81h-FFh127 байтХвост командной строки (заканчивается 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.

Смотрите также

Рекомендации

  1. ^ а б Тейлор, Роджер; Леммонс, Фил (июнь 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 стр.)
  2. ^ Некасек, Михал (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 содержит соответствующий удаленный вызов. […]
  3. ^ Пол, Маттиас Р. (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]
  4. ^ Пол, Матиас Р. (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]
  5. ^ «INT 21h, 62h - Получить адрес PSP (DOS 3.x)». Архивировано из оригинал на 2012-02-07.
  6. ^ а б 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]

дальнейшее чтение

внешняя ссылка