Префикс сегмента программы
Префикс сегмента программы (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.
См. также
[ редактировать ]- Нулевая страница (CP/M)
- ВЫЗОВ 5 (ДВА)
- Фрейм стека (Unix) [7]
- Каталог процессов (Multics) [7]
- Идентификатор процесса (PID) [7]
- это (компьютерное программирование)
- Самоссылка
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Тейлор, Роджер; Леммонс, Фил (июнь 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 страниц) - ^ Пол, Матиас Р. (07.10.2002) [2000]. «Re: Запуск COM-файла» . Группа новостей : alt.msdos.programmer . Архивировано из оригинала 3 сентября 2017 г. Проверено 3 сентября 2017 г. [15] (Примечание. Содержит подробную информацию о соглашениях о вызовах программ DOS COM.)
- ^ Некасек, Михал (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 содержит соответствующий дальний вызов. […]
- ^ Пол, Матиас Р. (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] - ^ Пол, Матиас Р. (1 мая 1997 г.) [01 марта 1995 г.]. «Подсказка по JPSofts 4DOS 5.5b/c, 5.51, 5.52a и NDOS» . МПДОСТИП (на немецком языке). Архивировано из оригинала 4 ноября 2016 г. Проверено 8 мая 2015 г. (Примечание. Предоставленная ссылка указывает на версию файла, преобразованную в HTML.
4DOS5TIP.TXT
файл, который является частьюMPDOSTIP.ZIP
сборник.) [17] - ^ «INT 21h,62h — Получить адрес PSP (DOS 3.x)» . Архивировано из оригинала 7 февраля 2012 г.
- ^ Перейти обратно: а б с Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михелс, Раймонд Дж.; Кайл, Джим (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]
Дальнейшее чтение
[ редактировать ]- 86-DOS — Дисковая операционная система для 8086 — Руководство программиста (PDF) . Версия 0.3 (Предварительная ред.). Сиэтл, Вашингтон, США: Seattle Computer Products, Inc., 1980. Архивировано из оригинала (PDF) 23 июня 2019 г .. Проверено 13 сентября 2011 г. (41 страница)
- «Формат префикса сегмента программы (PSP)» . ИНТЕР61 . 2000. Архивировано из оригинала 17 февраля 2020 г. Проверено 19 декабря 2019 г.
- Шеперс, Арне (1991). «Глава 5: Подробности об EXEC — префикс сегмента программы (PSP)». DOS 5 для программистов: Полный справочник (на немецком языке) (1-е изд.). Аддисон Уэсли (Германия) ГмбХ . стр. 148–151, 971–972. ISBN 3-89319-350-2 . (более 1123 страниц, раскладной, дискета 5,25 дюйма)
Внешние ссылки
[ редактировать ]- Доступ к аргументам командной строки (Microsoft.com)