Als Programmsegmentpräfix (englisch Program Segment Prefix, PSP)[1] bezeichnet man die ersten 256 Byte eines von MS-DOS geladenen Programmes. Es befindet sich in der Regel an Adresse CS:0 bis CS:FF, wobei CS für das Codesegmentregister steht und die Anfangsadresse des Codesegments enthält. Das PSP ist nicht in den ausführbaren Exe- oder COM-Dateien enthalten, sondern wird beim Laden des Programmes vom Betriebssystem erstellt. Die erste Hälfte des PSPs beinhaltet verschiedene Informationen für das Betriebssystem, insbesondere zur Handhabung mehrerer (nacheinander) ausgeführter Programme. In der zweiten Hälfte befindet sich die Kommandozeile (command tail, ohne den eigentlichen Namen des Programmes).

Struktur

Bearbeiten
Offset (hexadezimal) Größe (Bytes) Beschreibung
00 – 01 2 Bytes (Code) Interrupt-20h–Befehl zum Beenden des Programms nach einem Sprung zur Adresse 0000h[2]
02 – 03 Word (2 Bytes) Segmentadresse des ersten vom Programm nicht mehr belegten Speichers
04 Byte reserviert
05 – 09 5 Bytes (Code) CP/M-80 ähnlicher FAR CALL Eintrag in DOS[3]
0A – 0D DWord (4 Bytes) Kopie des Interrupt-Vektors 22h, Rückkehradresse nach Beenden des Programms
0E – 11 DWord Kopie des Interrupt-Vektors 23h, Interrupt für Strg-C
12 – 15 DWord Kopie des Interrupt-Vektors 24h, Interrupt für fatale Fehler
16 - 17 Word Segment des Parent-PSPs: das Programm, das dieses Programm ausgeführt hat
18 - 2B 20 Bytes Standardmäßige Job File Table (JFT), enthält je eine Dateitabellen-Nummer (System File Table, SFT) für bis zu 20 Datei-Handles
2C – 2D Word Segment des Umgebungsvariablen-Blocks (Environment) für dieses Programm
2E - 31 DWord Adresse des Stapelspeichers (Stack) beim letzten Ausführen des Interrupts 21h
32 - 33 Word Nummer aller Datei-Handles in der JFT, standardmäßig 20
34 - 37 DWord Adresse der aktuellen JFT, standardmäßig Offset 0018h in diesem PSP
38 - 3B DWord Zeiger zum vorhergehenden PSP (Wird nur für SHARE ab MS-DOS 3.3 verwendet)
3C - 3F 4 Bytes reserviert
40 - 41 Word Enthält ab MS-DOS 5.0 die DOS Version als HEX Wert.
42 - 4F 14 Bytes reserviert
50 – 52 3 Bytes (Code) Code um Interrupt 21h bei einem FAR CALL zur Adresse 0050h auszuführen
53 - 54 2 Bytes reserviert
55 - 5B 7 Bytes reserviert (kann dazu benutzt werden den File Control Block (FCB) in einen extended FCB zu verwandeln)
5C – 6B 16 Bytes File Control Block (FCB) des ersten Parameters der Kommandozeile
6C – 7F 20 Bytes FCB des zweiten Parameters
80 1 Byte Längenangabe der Kommandozeile
80 - AB 43 Bytes Bei Dateisuchoperationen von der standardmäßigen Disk Transfer Area (DTA) überschrieben
81 – FF 127 Bytes Kommandozeile mit allen Parametern, aber ohne den Kommandonamen selbst

Weitere Bereiche des PSPs werden von Betriebssystem-Erweiterungen oder manchen TSR-Programmen genutzt.

Beispiel-Programm

Bearbeiten

Dieses Programm zeigt die Kommandozeilenargumente des aufgerufenen Programms aus seinem PSP an: (COM-Datei, geschrieben in Assemblersprache, NASM-Syntax)

org  100h

; Interrupt 21h, Funktion 09h benötigt ein Dollarzeichen als Endmarkierung
mov  bl, byte [0080h]
xor  bh, bh
mov  byte [0081h+bx], '$'

; Ausgabe der Kommandozeile (bis zum ersten Dollarzeichen) mit Funktion 09h
mov  ah, 09h
mov  dx, 0081h
int  21h

; Beenden des Programmes mit Funktion 4Ch, Rückgabewert 00h
mov  ax, 4C00h
int  21h

Einzelnachweise

Bearbeiten
  1. https://thestarman.pcministry.com/asm/debug/debug.htm#SPECM A Guide to DEBUG - Special Memory Locations in MS-DEBUG
  2. https://devblogs.microsoft.com/oldnewthing/20200309-00/?p=103547 Why does MS-DOS put an int 20h at byte 0 of the COM file program segment? by Raymond Chen
  3. http://www.os2museum.com/wp/who-needs-the-address-wraparound-anyway/ Who needs the address wraparound, anyway? by Michal Necasek (englisch)