Programmsegmentpräfix

Das Programmsegmentpräfix (PSP) ist eine Datenstruktur, die in verwendet wird DOS Systeme zur Speicherung des Zustands von a Programm. Es ähnelt dem Null Seite in dem CP/m Betriebssystem. Die PSP hat die folgende Struktur:

Offset Größe Inhalt
00H - 01H 2 Bytes (Code) CP/M-80-ähnlich Ausgang (immer enthält Int 20h)[1][2]
02H - 03H Wort (2 Bytes) Segment des ersten Bytes jenseits des Gedächtnisses, der dem Programm zugewiesen wurde
04H Byte Reserviert
05H - 09H 5 Bytes (Code) CP/M-80-ähnlich Rufen Sie den Eintrag in DOS und Programmsegmentgröße an[1][3]
0ah - 0dh DWORD (4 Bytes) Adresse des vorherigen Programms beenden (Old Int 22H)
0EH - 11H DWORD Break -Adresse des vorherigen Programms (Old Int 23h)
12H - 15H DWORD Kritische Fehleradresse des vorherigen Programms (Old int 24h)
16H - 17H Wort PSP -Segment des Elternteils (normalerweise Command.com - intern)
18h - 2bh 20 Bytes Jobdatei Tabelle (Jft) (intern)
2Ch -2dh Wort Umfeld Segment
2EH - 31H DWORD SS: SP beim Eintritt bis zuletzt Int 21h Rufen Sie an (intern)
32H - 33H Wort JFT -Größe (intern)
34H - 37H DWORD Zeiger auf JFT (intern)
38H - 3BH DWORD Zeiger auf vorherige PSP (nur von Share in DOS 3.3 und später verwendet)
3ch - 3fh 4 Bytes Reserviert
40H - 41H Wort DOS -Version zurückzugeben (DOS 5 und später, verändert über Setver in DOS 5 und später)
42H - 4fh 14 Bytes Reserviert
50H - 52H 3 Bytes (Code) Unix-LIE FAR RAD -ZUSAMMENT in DOS (enthält immer int 21H + RETF)
53H - 54H 2 Bytes Reserviert
55H - 5BH 7 Bytes Reserviert (kann verwendet werden, um den ersten FCB zu einem erweiterten FCB zu machen)
5ch - 6bh 16 Bytes Ungeöffneter Standard FCB 1
6ch - 7fh 20 Bytes Ungeöffnetes Standard -FCB 2 (überschrieben, wenn FCB 1 geöffnet ist)
80h 1 Byte Anzahl der Bytes auf Befehlszeile
81H -FFH 127 Bytes Befehlszeilenschwanz (beendet von a 0dh)[4][5]

Die PSP wird am häufigsten verwendet, um das zu bekommen Kommandozeilenargumente eines DOS -Programms; Zum Beispiel führt der Befehl "foo.exe /a /f" foo.exe mit den Argumenten ' /a' und ' /f' aus.

Wenn der PSP-Eintrag für die Befehlszeilenlänge ungleich Null ist und der Zeiger auf das Umgebungssegment weder 0000H noch FFFFH ist, sollten Programme zunächst versuchen, die Befehlszeile aus dem abzurufen Umgebungsvariable %Cmdline% bevor Sie es aus der PSP extrahieren. Auf diese Weise ist es möglich, Befehlszeilen länger als 126 Zeichen an Anwendungen zu übergeben.

Die Segmentadresse des PSP wird im DS -Register übergeben, wenn das Programm ausgeführt wird. Es kann auch später unter Verwendung der int 21H -Funktion 51H oder int 21H -Funktion 62H bestimmt werden. Bei beiden Funktionen wird die PSP -Adresse in Register BX zurückgegeben.[6]

Alternativ in .Com Programme, die zum Offset geladen wurden 100hMan kann den PSP direkt mit den oben aufgeführten Offsets adressieren. Offset 000H zeigt auf den Beginn der PSP, 0ffh Punkte bis zum Ende usw.

Der folgende Code zeigt beispielsweise die Befehlszeilenargumente an:

Org 100h  ; .Com - Nicht ds verwenden ; Int 21h Subfunktion 9 erfordert '$', um die Zeichenfolge zu beenden xor  BX,BX MOV  bl, [80h] CMP  bl,7EH  Ja  Ausfahrt  ; Überlauf verhindern MOV  Byte [BX+81H],"$" ; Drucken Sie die Zeichenfolge MOV  Ah,9 MOV  dx,81H int  21h Ausfahrt: MOV  Axt,4c00h  ; Unterfunktion 4c int  21h 

In DOS 1.x war es erforderlich, dass das CS -Register (Code -Segment) das gleiche Segment wie die PSP bei Programmabschluss enthält. geladen mit dem PSP -Segment) und das Programm mit einer RETF -Anweisung beenden, die den gespeicherten Segmentwert aus dem Stapel stürzen und an die Adresse 0 des PSP springen würde, die eine int 20H -Anweisung enthielt.

; sparen drücken  ds xor  Axt,Axt drücken  Axt ; Wechseln Sie zur Standarddatengruppe (@data) MOV  Axt,@Daten MOV  ds,Axt ; Meldung in Mess1 (21H Subfunktion 9) Druck ausdrucken MOV  dx,Mess1 MOV  Ah,9 int  21h Retf 

Wenn die ausführbare Datei eine .com -Datei war, war diese Prozedur unnötig und das Programm konnte lediglich mit einer direkten Int 20H -Anweisung oder dem Aufruf von Int 21H -Funktion 0 beendet werden. Der Programmierer musste jedoch weiterhin sicherstellen, dass das CS -Register die Segmentadresse enthielt der PSP bei Programmabschluss. Daher,

JMP  Anfang Mess1 db "Hallo Welt! $" Anfang: MOV  dx,Mess1 MOV  Ah,9 int  21h int  20h 

In DOS 2.x und höher wurde die Programmabschluss stattdessen mit der int 21H -Funktion 4Ch erreicht, für die das CS -Register nicht den Segmentwert des PSP enthält.

Siehe auch

Verweise

  1. ^ a b Taylor, Roger; Lemmons, Phil (Juni 1982). "Aufwärtsmigration - Teil 1: Übersetzer - Verwenden von Übersetzungsprogrammen zum Verschieben von CP/M -86 -Programmen in CP/M und MS -DOS" [Verwenden von Übersetzungsprogrammen zum Verschieben von CP/M-Programmen in CP/M-86 und MS-DOS] (PDF). BYTE. Vol. 7, nein. 6. Byte Publications Inc. S. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN 0360-5280. Coden Bytedj. Archiviert (PDF) vom Original am 2020-01-16. Abgerufen 2020-01-15. […] Zugang zu Zugang zu CP/M-86 […] Zugriff auf CP/M-86 muss den Funktionscode in das Cl-Register platzieren, den Parameter Byte in das DL-Register platzieren oder den Wortparameter im DX-Register platzieren, wodurch das Datensegment in das DS-Register platziert wird (die Daten Das Segment wird normalerweise nicht für ein konvertiertes Programm geändert) und führt eine Software -Interrupt aus. Int #224. Das Ergebnis wird im Al -Register zurückgegeben, wenn es sich um einen Bytewert handelt. Wenn das Ergebnis ein Wortwert ist, wird es sowohl in den AX- als auch in den BX -Registern zurückgegeben. Doppelwortwerte werden mit dem Offset in den BX-Registern und dem Segment im ES-Register zurückgegeben. Umwandlung von Programmen von CP/M-80 Nach CP/M-86 muss der Anruf an Ort 5 durch die Software Interrupt Int #224 ersetzt werden. Eine andere notwendige Änderung beinhaltet die warmer Stiefel. Unter CP/M-80 kann auf den warmen Stiefel mit einem Systemaufruf mit einem Funktionscode von 0 für einen Sprung zu Ort 0 zugegriffen werden. CP/M-86 unterstützt jedoch nicht den Sprung zu Ort 0. Sie müssen diesen Programm -Beenden im übersetzten Programm ändern, wenn das Programm korrekt ausgeführt werden soll. Vorausgesetzt, der Anruf zu Ort 5 wird durch INT #224 ersetzt, dass die Warm-Boot-Änderung vorgenommen wird und dass die Register korrekt zugeordnet sind . […] Zugang zu Zugang zu MS-DOS […] Obwohl MS-DOS einen "bevorzugten" Mechanismus durch einen Soft-War-Interrupt hat, hat Int #33Für den Zugriff auf das System wird ein zusätzlicher Mechanismus für "bereits bestehende" Programme bereitgestellt, die mit CP/M-80-Aufrufkonventionen kompatibel sind, zumindest für Funktionen im Bereich von 0-36. In Bezug auf Systemaufrufe innerhalb des zulässigen Funktionsbereichs muss der Programmierer nichts für übersetzte Programme tun, um sie dazu zu bringen, unter MS-DOS zu laufen, außer die Register korrekt zu kartieren. MS-DOS unterstützt auch die Warm Boot-Funktion von CP/M-80. Ein Sprung zu Ort 0 unter MS-DOS führt einen Software-Interrupt aus. Int #32, was funktional ein Programmende und die normale Art, aus einem Programm zu verlassen. […] [1] [2][3][4][5][6][7][8][9][10][11][12][13][14] (13 Seiten)
  2. ^ Paul, Matthias R. (2002-10-07) [2000]. "Re: Ausführen einer COM -Datei". Newsgroup:ALT.MSDOS.Programmer. Archiviert vom Original am 2017-09-03. Abgerufen 2017-09-03. [15] (NB. Hat Details zum DOS COM -Programm, das Konventionen aufruft.)
  3. ^ Necasek, Michal (2011-09-13). "Wer braucht die Adresse überhaupt umwickelt?". OS/2 Museum. Archiviert vom Original am 2020-02-19. Abgerufen 2020-02-19. […] 86-dos, und daher PC dos/MS-DOSbenutzte einen cleveren Trick. Das Byte bei Offset 5 des PSP enthielt einen far Call Opcode (9AH); Das Wort bei Offset 6 des PSP enthielt den entsprechenden Wert, um die Programmsegmentgröße anzuzeigen, und auch den Offset -Teil des FAR -Anrufs. Das Wort bei Offset 8, das als Segmentteil des fernen Aufrufs diente, wurde so gestaltet 8086 CPU) und auf die Adresse 0: C0H zeigen, die Interrupt -Vektor 30H enthält. […] das Rufen Sie 5 an Die Schnittstelle funktioniert auch in der DOS -Emulation unter Windows NT und OS/2, und diese Systeme können mit Sicherheit nicht mit dem ausgeführt werden A20 -Linie deaktiviert. Wie funktioniert das dann? […] Anstatt Adressbits abzuhacken, spiegelt das System die fünf Bytes bei 0: C0H bei 1000C0H wider. Die gleiche Technik war tatsächlich in DOS 5 und höher verwendet worden mit dem Laufen mit Dos = hoch. In diesem Fall stellt DOS sicher, dass die lineare Adresse 1000C0H den entsprechenden FAR -Anruf enthält. […]
  4. ^ Paul, Matthias R. (1997-07-01) [1994-01-01]. Msdostips-Tipps für den Umgang mit MS-DOS 5.0-7. Mpdostip (auf Deutsch). Archiviert vom Original am 2017-08-22. Abgerufen 2013-10-25. (Nb. Msdostip.txt ist Teil von mpdostip.zip, wurde bis 2001 gepflegt und zu diesem Zeitpunkt auf vielen Websites verteilt. Der bereitgestellte Link zeigt auf eine HTML-konvertierte ältere Version der msdostip.txt-Datei.) [16]
  5. ^ Paul, Matthias R. (1997-05-01) [1995-03-01]. "Hinweise Zu Jpsofts 4DOS 5.5B/C, 5,51, 5,52a und ndos". Mpdostip (auf Deutsch). Archiviert vom Original am 2016-11-04. Abgerufen 2015-05-08. (NB. Die bereitgestellten Linkpunkte auf eine HTML-konvertierte Version der 4DOS5TIP.TXT Datei, die Teil der ist Mpdostip.zip Sammlung.) [17]
  6. ^ "Int 21h, 62h - Get PSP -Adresse (DOS 3.x)". Archiviert von das Original Am 2012-02-07.
  7. ^ a b c Schulman, Andrew; Brown, Ralf D.; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994) [November 1993]. Undokumentierte DOS: Ein Programmierhandbuch zu reservierten MS-DOS-Funktionen und Datenstrukturen-erweitert um MS-DOS 6, Novell DOS und Windows 3.1 (2 ed.). Lesen, Massachusetts, USA: Addison Wesley. ISBN 0-201-63287-x. (xviii+856+vi Seiten, 3,5 "-Floppy) Errata: [18][19]

Weitere Lektüre

Externe Links