Programsegment præfiks - Program Segment Prefix

Den Program Segment Prefix (PSP) er en datastruktur, der anvendes i DOS -systemer til at lagre tilstanden af et program . Det ligner nul -siden i CP/M -operativsystemet. PSP'en har følgende struktur:

Offsetbilleder Størrelse Indhold
00h-01h 2 bytes (kode) CP/M -80 -lignende exit (indeholder altid INT 20 timer )
02h-03h ord (2 bytes) Segment af den første byte ud over den hukommelse, der er tildelt programmet
04 timer byte Reserveret
05-09 5 bytes (kode) CP/M-80-lignende fjernopkald til DOS og programsegmentstørrelse
0Ah-0Dh dword (4 bytes) Afslut adresse på tidligere program (gammel INT 22h )
0Eh-11h dword Pauseadresse for forrige program (gammel INT 23h )
12-15 timer dword Kritisk fejladresse for forrige program (gammel INT 24 timer )
16-17 ord Forældres PSP -segment (normalt COMMAND.COM - internt)
18h-2Bh 20 bytes Job File Table (JFT) (intern)
2Ch-2Dh ord Miljø segment
2Eh-31h dword SS: SP ved indgang til sidste INT 21 -timers opkald (internt)
32t-33h ord JFT -størrelse (intern)
34h-37h dword Markør til JFT (intern)
38h-3Bh dword Markør til tidligere PSP (bruges kun af SHARE i DOS 3.3 og nyere)
3Ch-3Fh 4 bytes Reserveret
40-41 timer ord DOS -version returneres (DOS 4 og senere, kan ændres via SETVER i DOS 5 og senere)
42h-4Fh 14 bytes Reserveret
50t-52h 3 bytes (kode) Unix -lignende langt opkald til DOS (indeholder altid INT 21h + RETF)
53h-54h 2 bytes Reserveret
55h-5Bh 7 bytes Reserveret (kan bruges til at lave første FCB til en udvidet FCB)
5Ch-6Bh 16 bytes Uåbnet Standard FCB 1
6Ch-7Fh 20 bytes Uåbnet Standard FCB 2 (overskrives hvis FCB 1 åbnes)
80 timer 1 byte Antal bytes på kommandolinjen
81h-FFh 127 bytes Kommandolinjehale (afsluttet med en 0Dh )

PSP'en bruges oftest til at hente kommandolinjeargumenterne for et DOS -program; f.eks. udfører kommandoen "FOO.EXE /A /F" FOO.EXE med argumenterne ' /A' og ' /F'.

Hvis PSP-posten for kommandolinjelængden ikke er nul, og markøren til miljøsegmentet hverken er 0000h eller FFFFh, bør programmer først prøve at hente kommandolinjen fra miljøvariablen % CMDLINE %, før den udtrækkes fra PSP. På denne måde er det muligt at videregive kommandolinjer længere end 126 tegn til applikationer.

Segmentadressen for PSP'en sendes i DS -registret, når programmet udføres. Det kan også bestemmes senere ved at bruge Int 21h -funktion 51h eller Int 21h -funktion 62h. Begge funktioner returnerer PSP -adressen i register BX.

Alternativt kan man i .COM -programmer indlæst ved offset 100hadressere PSP'en direkte ved blot at bruge de offsets, der er anført ovenfor. Offset 000hpeger på begyndelsen af ​​PSP, 0FFhpeger på slutningen osv.

For eksempel viser følgende kode kommandolinjeargumenterne:

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

I DOS 1.x var det nødvendigt for CS (Code Segment) -registret at indeholde det samme segment som PSP ved programafslutning, og derfor involverede standard programmeringspraksis at gemme DS -registret på stakken ved programstart (da DS -registret er indlæst med PSP -segmentet) og afslutte programmet med en RETF -instruktion, som ville springe den gemte segmentværdi ud af stakken og hoppe til adresse 0 på PSP'en, som indeholdt en INT 20h -instruktion.

; 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

Hvis den eksekverbare fil var en .COM -fil, var denne procedure unødvendig, og programmet kunne afsluttes med en direkte INT 20h -instruktion eller kaldes INT 21h -funktion 0. Programmereren skulle dog stadig sikre, at CS -registeret indeholdt segmentadressen af PSP ved programafslutning. Dermed,

jmp   start

mess1 db 'Hello world!$'

start:
mov   dx,mess1
mov   ah,9
int   21h

int   20h

I DOS 2.x og højere blev programafslutning i stedet gennemført med INT 21h -funktion 4Ch, som ikke krævede, at CS -registret indeholdt PSP's segmentværdi.

Se også

Referencer

Yderligere læsning

eksterne links