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 100h
Man 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
- Null Seite (CP/M)
- Rufen Sie 5 (DOS) an
- Stapelrahmen (UNIX)[7]
- Prozessverzeichnis (Multics)[7]
- Prozesskennung (PID)[7]
- Dies (Computerprogrammierung)
- Selbstreferenz
Verweise
- ^ 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) - ^ 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.)
- ^ 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. […]
- ^ 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]
- ^ 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 istMpdostip.zip
Sammlung.) [17] - ^ "Int 21h, 62h - Get PSP -Adresse (DOS 3.x)". Archiviert von das Original Am 2012-02-07.
- ^ 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
- 86 -DOS - Disk -Betriebssystem für das 8086 - Programmierhandbuch (PDF). Version 0.3 (vorläufige Ausgabe). Seattle, Washington, USA: Seattle Computer Products, Inc. 1980. archiviert von das Original (PDF) Am 2019-06-23. Abgerufen 2011-09-13. (41 Seiten)
- "Format des Programmsegments Präfix (PSP)". Inter61. 2000. Archiviert vom Original am 2020-02-17. Abgerufen 2019-12-19.
- Schäpers, Arne (1991). "Kapitel 5: Exec IM -Detail - Programmsegmentpräfix (PSP)". DOS 5 für Programmierer: Die Endgültige Referenz (auf Deutsch) (1 Ed.). Addison Wesley (Deutschland) GmbH. S. 148–151, 971–972. ISBN 3-89319-350-2. (1123+v Seiten, Ausklapperium, 5,25 "-Floppy)
Externe Links
- Zugriff auf Befehlszeilenargumente (Microsoft.com)