Prefixul segmentului de program - Program Segment Prefix
Segmentul Programul Prefix (PSP) este o structură de date utilizate în DOS sisteme pentru a stoca starea unui program de . Seamănă cu pagina zero din sistemul de operare CP / M. PSP are următoarea structură:
Imagini offset | mărimea | Cuprins |
---|---|---|
00h-01h | 2 octeți (cod) | CP / M-80 - ca ieșire (conține întotdeauna INT 20h ) |
02h-03h | cuvânt (2 octeți) | Segmentul primului octet dincolo de memoria alocată programului |
04h | octet | Rezervat |
05h-09h | 5 octeți (cod) | Intrarea apelurilor îndepărtate CP / M-80 în DOS și dimensiunea segmentului de program |
0Ah-0Dh | dword (4 octeți) | Terminați adresa programului anterior (vechiul INT 22h ) |
0Eh-11h | dword | Adresa de pauză a programului anterior (vechiul INT 23h ) |
12h-15h | dword | Adresa de eroare critică a programului anterior (vechiul INT 24h ) |
16h-17h | cuvânt | Segmentul PSP al părinților (de obicei COMMAND.COM - intern) |
18h-2Bh | 20 octeți | Tabel fișier job (JFT) (intern) |
2Ch-2Dh | cuvânt | Segment de mediu |
2Eh-31h | dword | SS: SP la intrarea în ultimul apel INT 21h (intern) |
32h-33h | cuvânt | Dimensiunea JFT (internă) |
34h-37h | dword | Pointer către JFT (intern) |
38h-3Bh | dword | Pointer către PSP anterioară (utilizat doar de SHARE în DOS 3.3 și versiuni ulterioare) |
3Ch-3Fh | 4 octeți | Rezervat |
40h-41h | cuvânt | Versiunea DOS de returnat (DOS 4 și versiuni ulterioare, modificabile prin SETVER în DOS 5 și versiuni ulterioare) |
42h-4Fh | 14 octeți | Rezervat |
50h-52h | 3 octeți (cod) | Intrarea apelurilor îndepărtate de tip Unix în DOS (conține întotdeauna INT 21h + RETF) |
53h-54h | 2 octeți | Rezervat |
55h-5Bh | 7 octeți | Rezervat (poate fi folosit pentru a transforma primul FCB într-un FCB extins) |
5Ch-6Bh | 16 octeți | FCB standard nedeschis 1 |
6Ch-7Fh | 20 octeți | FCB 2 standard nedeschis (suprascris dacă FCB 1 este deschis) |
80h | 1 octet | Numărul de octeți pe linia de comandă |
81h-FFh | 127 octeți | Coada liniei de comandă (terminată cu 0Dh ) |
PSP este cel mai des folosit pentru a obține argumentele de linie de comandă ale unui program DOS; de exemplu, comanda „FOO.EXE / A / F” execută FOO.EXE cu argumentele „/ A” și „/ F”.
Dacă intrarea PSP pentru lungimea liniei de comandă este diferită de zero și indicatorul către segmentul de mediu nu este nici 0000h, nici FFFFh, programele ar trebui mai întâi să încerce să recupereze linia de comandă din variabila de mediu % CMDLINE% înainte de a o extrage din PSP. În acest fel, este posibil să transmiteți aplicațiilor linii de comandă mai lungi de 126 de caractere.
Adresa segmentului PSP este transmisă în registrul DS atunci când programul este executat. De asemenea, poate fi determinat ulterior utilizând funcția Int 21h 51h sau funcția Int 21h 62h. Oricare dintre funcții va returna adresa PSP în registrul BX.
Alternativ, în programele .COM încărcate la offset 100h
, se poate adresa PSP direct doar folosind offset-urile enumerate mai sus. Offset 000h
indică începutul PSP, 0FFh
indică sfârșitul etc.
De exemplu, următorul cod afișează argumentele liniei de comandă:
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
În DOS 1.x, a fost necesar ca registrul CS (Code Segment) să conțină același segment ca PSP la terminarea programului, astfel practica standard de programare presupunea salvarea registrului DS în stivă la începutul programului (deoarece registrul DS este încărcat cu segmentul PSP) și terminarea programului cu o instrucțiune RETF, care ar scoate valoarea de segment salvată de pe stivă și ar trece la adresa 0 a PSP, care conținea o instrucțiune INT 20h.
; 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
Dacă executabilul era un fișier .COM, această procedură nu era necesară și programul putea fi terminat doar cu o instrucțiune directă INT 20h sau altfel apelând funcția INT 21h. Cu toate acestea, programatorul a trebuit să se asigure că registrul CS conține adresa segmentului. PSP la terminarea programului. Prin urmare,
jmp start
mess1 db 'Hello world!$'
start:
mov dx,mess1
mov ah,9
int 21h
int 20h
În DOS 2.x și versiuni ulterioare, terminarea programului a fost realizată cu funcția INT 21h Funcție 4Ch care nu a necesitat ca registrul CS să conțină valoarea segmentului PSP.
Vezi si
- Pagină zero (CP / M)
- APEL 5 (DOS)
- Stack frame (Unix)
- Director de proces (Multics)
- Identificator proces (PID)
- aceasta (programare computer)
- Auto-referință
Referințe
Lecturi suplimentare
- 86-DOS - Sistem de operare pe disc pentru 8086 - Manualul programatorului (PDF) . Versiunea 0.3 (ed. Preliminară). Seattle, Washington, SUA: Seattle Computer Products, Inc. 1980. Arhivat din original (PDF) în 2019-06-23 . Adus 13-09-2011 . (41 pagini)
- "Format prefix segment segment (PSP)" . INTER61 . 2000. Arhivat din original la data de 2020-02-17 . Adus 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 (în germană) (1 ed.). Addison Wesley (Deutschland) GmbH . pp. 148-151, 971-972. ISBN 3-89319-350-2. (1123 + pagini v, foldable, dischetă de 5,25 ")
linkuri externe
- Accesarea argumentelor liniei de comandă (Microsoft.com)