Jump to content

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

(Перенаправлено из префикса сегмента программы )

Префикс сегмента программы (PSP) — это структура данных, используемая в системах DOS для хранения состояния программы . Это похоже на нулевую страницу в операционной системе CP/M . ППС имеет следующую структуру:

Компенсировать Размер Содержание
00–01 ч. 2 байта (код) Выход типа CP/M-80 (всегда содержит INT 20h ) [1] [2]
02–03 ч. слово (2 байта) Сегмент первого байта за пределами памяти, выделенной программе
04ч байт Сдержанный
05:00–09:00 5 байт (код) Запись дальнего вызова в стиле CP/M-80 в DOS и размер сегмента программы [1] [3]
0Ач – 0Дч двойное слово (4 байта) Завершить адрес предыдущей программы (старый INT 22h )
0Эх–11ч двойное слово Адрес прерывания предыдущей программы (старый INT 23h )
12:00–15:00 двойное слово Адрес критической ошибки предыдущей программы (старый INT 24h )
16–17 часов слово Родительский сегмент PSP (обычно COMMAND.COM — внутренний)
18:00–2ЧС 20 байт Таблица файлов заданий (JFT) (внутренняя)
2Ч–2Дч слово Экологический сегмент
2Э–31ч двойное слово SS:SP при входе в последний вызов INT за 21 час (внутренний)
32–33 часа слово Размер JFT (внутренний)
34–37 часов двойное слово Указатель на JFT (внутренний)
38ч–3ч двойное слово Указатель на предыдущую PSP (используется только SHARE в DOS 3.3 и более поздних версиях)
3Ч–3Фч 4 байта Сдержанный
40–41 ч. слово Версия DOS для возврата (DOS 5 и новее, в DOS 5 и новее можно изменить с помощью SETVER)
42ч–4Fч 14 байт Сдержанный
50–52 часа 3 байта (код) Unix -подобная запись дальнего вызова в DOS (всегда содержит INT 21h + RETF)
53–54 часа 2 байта Сдержанный
55ч–5Мч 7 байт Зарезервировано (может использоваться для преобразования первого FCB в расширенный FCB)
5Ч–6Бх 16 байт Неоткрытый стандартный FCB 1
6Ч–7Фч 20 байт Неоткрытый стандартный FCB 2 (перезаписывается, если FCB 1 открыт)
80 часов 1 байт Количество байтов в командной строке
81ч–FFч 127 байт Конец командной строки (завершается 0Dh ) [4] [5]

PSP чаще всего используется для получения аргументов командной строки программы DOS; например, команда «FOO.EXE /A /F» запускает FOO.EXE с аргументами «/A» и «/F».

Если запись PSP для длины командной строки не равна нулю, а указатель на сегмент среды не равен ни 0000h, ни FFFFh, программы должны сначала попытаться получить командную строку из переменной среды %CMDLINE%, прежде чем извлекать ее из PSP. Таким образом, можно передавать приложениям командные строки длиной более 126 символов.

Адрес сегмента PSP передается в регистр DS при выполнении программы. Его также можно определить позже, используя функцию Int 21h 51h или функцию Int 21h 62h. Любая функция вернет адрес PSP в регистре BX. [6]

Альтернативно, в программах .COM , загружаемых по смещению 100h, можно обратиться к PSP напрямую, просто используя смещения, перечисленные выше. Компенсировать 000h указывает на начало PSP, 0FFh указывает на конец и т. д.

Например, следующий код отображает аргументы командной строки:

org   100h      ; .COM - not using ds

; INT 21h subfunction 9 requires '$' to terminate string
xor   bx,bx
mov   bl,[80h]
cmp   bl,7Eh
 ja   exit      ; preventing overflow

mov   byte [bx+81h],'$'

; print the string
mov   ah,9
mov   dx,81h
int   21h

exit:
mov   ax,4C00h  ; subfunction 4C
int   21h

В DOS 1.x было необходимо, чтобы регистр CS (сегмент кода) содержал тот же сегмент, что и PSP при завершении программы, поэтому стандартная практика программирования включала сохранение регистра DS (поскольку регистр DS загружается сегментом PSP). вместе с нулевым словом в стек при запуске программы и завершением программы с помощью инструкции RETF, которая извлекает сохраненное значение сегмента из стека и переходит к адресу 0 PSP, который содержит инструкцию INT 20h.

; save
push  ds
xor   ax,ax
push  ax

; move to the default data group (@data)
mov   ax,@data
mov   ds,ax

; print message in mess1 (21h subfunction 9)
mov   dx,mess1
mov   ah,9
int   21h

retf

Если исполняемый файл представлял собой файл .COM, в этой процедуре не было необходимости, и программу можно было завершить просто с помощью прямой инструкции INT 20h или вызова функции INT 21h 0. Однако программист все равно должен был убедиться, что регистр CS содержит адрес сегмента. PSP при завершении программы. Таким образом,

jmp   start

mess1 db 'Hello world!$'

start:
mov   dx,mess1
mov   ah,9
int   21h

int   20h

В DOS 2.x и выше завершение программы вместо этого выполнялось с помощью функции INT 21h 4Ch, которая не требовала, чтобы регистр CS содержал значение сегмента PSP.

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б Тейлор, Роджер; Леммонс, Фил (июнь 1982 г.). «Восходящая миграция. Часть 1: Переводчики. Использование программ перевода для перемещения программ CP/M-86 в CP/M и MS-DOS» [Использование программ перевода для перемещения программ CP/M в CP/M-86 и MS-DOS] (PDF) . БАЙТ . Том. 7, нет. 6. BYTE Publications Inc., стр. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN   0360-5280 . КОДЕН   БАЙТЕДЖ . Архивировано (PDF) из оригинала 16 января 2020 г. Проверено 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 для перехода в ячейку 0. Однако CP/M-86 не поддерживает переход в ячейку 0. В результате , вы должны изменить этот выход программы в переведенной программе, чтобы программа работала правильно. При условии, что вызов ячейки 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 страниц)
  2. ^ Пол, Матиас Р. (07.10.2002) [2000]. «Re: Запуск COM-файла» . Группа новостей : alt.msdos.programmer . Архивировано из оригинала 3 сентября 2017 г. Проверено 3 сентября 2017 г. [15] (Примечание. Содержит подробную информацию о соглашениях о вызовах программ DOS COM.)
  3. ^ Некасек, Михал (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 = ВЫСОКИЙ . В этом случае DOS гарантирует, что линейный адрес 1000C0h содержит соответствующий дальний вызов. […]
  4. ^ Пол, Матиас Р. (1 июля 1997 г.) [1 января 1994 г.]. MSDOSTIPs — Советы по использованию MS-DOS 5.0-7 (на немецком языке). Архивировано из оригинала 22 августа 2017 г. Проверено 25 октября 2013 г. {{cite book}}: |work= игнорируется ( помощь ) (Примечание. MSDOSTIP.TXT является частью MPDOSTIP.ZIP, поддерживался до 2001 года и в то время распространялся на многих сайтах. Предоставленная ссылка указывает на более старую версию файла MSDOSTIP.TXT, преобразованную в HTML.) [ 16]
  5. ^ Пол, Матиас Р. (1 мая 1997 г.) [01 марта 1995 г.]. «Подсказка по JPSofts 4DOS 5.5b/c, 5.51, 5.52a и NDOS» . МПДОСТИП (на немецком языке). Архивировано из оригинала 4 ноября 2016 г. Проверено 8 мая 2015 г. (Примечание. Предоставленная ссылка указывает на версию файла, преобразованную в HTML. 4DOS5TIP.TXT файл, который является частью MPDOSTIP.ZIP сборник.) [17]
  6. ^ «INT 21h,62h — Получить адрес PSP (DOS 3.x)» . Архивировано из оригинала 7 февраля 2012 г.
  7. ^ Перейти обратно: а б с Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михелс, Раймонд Дж.; Кайл, Джим (1994) [ноябрь 1993 г.]. Недокументированная DOS: Руководство программиста по зарезервированным функциям и структурам данных MS-DOS - расширено и включает MS-DOS 6, Novell DOS и Windows 3.1 (2-е изд.). Ридинг, Массачусетс, США: Эддисон Уэсли . ISBN  0-201-63287-Х . (xviii+856+vi страниц, 3,5-дюймовая дискета) Исправления: [18] [19]

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2a926dd9f2aad7ea833fb46e8fc51e7e__1685273580
URL1:https://arc.ask3.ru/arc/aa/2a/7e/2a926dd9f2aad7ea833fb46e8fc51e7e.html
Заголовок, (Title) документа по адресу, URL1:
Program Segment Prefix - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)