stringtranslate.com

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

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

Чаще всего 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 - не использует ds  ; INT 21h подфункция 9 требует '$' для завершения строки xor bx , bx mov bl ,[ 80h ] cmp bl , 7Eh ja exit ; предотвращение переполнения      mov байт [ 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 21h   ретф

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

начало jmp mess1 db 'Привет, мир!$'  начало: mov dx , mess1 mov ah , 9 int 21h   цел . 20ч 

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

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

Ссылки

  1. ^ ab Taylor, Roger; Lemmons, Phil (июнь 1982 г.). "Восходящая миграция - Часть 1: Трансляторы - Использование программ перевода для перемещения программ CP/M-86 на CP/M и MS-DOS" [Использование программ перевода для перемещения программ CP/M на CP/M-86 и MS-DOS] (PDF) . BYTE . Том 7, № 6. BYTE Publications Inc. стр. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN  0360-5280. КОДЕН  BYTEDJ. Архивировано (PDF) из оригинала 2020-01-16 . Получено 15.01.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. ^ Пол, Маттиас Р. (2002-10-07) [2000]. "Re: Запуск COM-файла". Группа новостей : alt.msdos.programmer. Архивировано из оригинала 2017-09-03 . Получено 2017-09-03 .[15] (Примечание. Содержит подробную информацию о соглашениях о вызовах программ DOS COM.)
  3. ^ Necasek, Michal (2011-09-13). "Кому вообще нужен перенос адреса?". Музей OS/2 . Архивировано из оригинала 2020-02-19 . Получено 2020-02-19 . […] 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 содержит соответствующий дальний вызов. […]
  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 г.) [1 марта 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)". Архивировано из оригинала 2012-02-07.
  7. ^ abc Шульман, Эндрю; Браун, Ральф Д .; Макси, Дэвид; Михельс, Рэймонд Дж.; Кайл, Джим (1994) [ноябрь 1993]. Недокументированная DOS: руководство программиста по зарезервированным функциям и структурам данных MS-DOS — расширено для включения MS-DOS 6, Novell DOS и Windows 3.1 (2-е изд.). Рединг, Массачусетс, США: Addison Wesley . ISBN 0-201-63287-X.(xviii+856+vi страниц, 3,5-дюймовая дискета) Опечатки: [18][19]

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

Внешние ссылки