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å
- Nul side (CP/M)
- OPKALD 5 (DOS)
- Stabelramme (Unix)
- Behandl bibliotek (Multics)
- Procesidentifikator (PID)
- dette (computerprogrammering)
- Selvreference
Referencer
Yderligere læsning
- 86 -DOS - Diskoperativsystem til 8086 - Programmeringsvejledning (PDF) . Version 0.3 (foreløbig udgave). Seattle, Washington, USA: Seattle Computer Products, Inc. 1980. Arkiveret fra originalen (PDF) den 2019-06-23 . Hentet 2011-09-13 . (41 sider)
- "Format af programsegmentprefiks (PSP)" . INTER61 . 2000. Arkiveret fra originalen 2020-02-17 . Hentet 2019-12-19 .
- Schäpers, Arne (1991). "Kapitel 5: EXEC im Detail - Program Segment Prefix (PSP)". DOS 5 für Programmierer: Die endgültige Referenz (på tysk) (1 udgave). Addison Wesley (Deutschland) GmbH . s. 148–151, 971–972. ISBN 3-89319-350-2. (1123+v sider, foldout, 5,25 "-display)
eksterne links
- Adgang til kommandolinjeargumenter (Microsoft.com)