Prefixul de segment de program (din engleză - „Prefixul de segment de program”, abreviat PSP ) este o structură de date care este utilizată în sistemele de operare ale familiei DOS și CP/M pentru a salva starea programelor de calculator .
PSP în DOS are următoarea structură:
Decalaj | mărimea | Cuprins |
---|---|---|
00-01 | 2 octeți (cod) | Conține cod de ieșire INT 20 în stil CP/M (pentru compatibilitate) |
02-03 | cuvânt mașină (2 octeți) | Segmentul imediat după memoria alocată programului |
04 | octet | rezervat |
05-09 | 5 octeți (cod) | Conține codul CALL FAR pentru apelarea funcțiilor DOS în stil CP/M (pentru compatibilitate) |
0A-0D | dword (4 octeți) | Adresa handler-ului Terminate al programului anterior (anterior INT 22) |
0E-11 | dword | Adresa de gestionare a pauzei a programului anterior (anterior INT 23) |
12-15 | dword | Adresa de gestionare a erorilor critice din programul anterior (anterior INT 24) |
16-17 | cuvânt mașină | Segmentul PSP al procesului de apelare (de obicei, command.com este intern) |
18-2B | 20 de octeți | ro:Job File Table (intern) |
2C-2D | cuvânt mașină | Segment variabil de mediu |
2E-31 | dword | SS:SP la intrarea la ultimul apel INT 21 (intern) |
32-33 | cuvânt mașină | numărul maxim de fișiere deschise (intern - vezi mai jos) |
34-37 | dword | Adresa intrărilor manuale (internă - vezi mai jos) |
38-4F | 24 de octeți | rezervat |
50-52 | 3 octeți (cod) | Pentru a apela la DOS (conține întotdeauna INT 21 + RETF) |
53-5B | 9 octeți | rezervat |
5C-6B | 16 octeți | Nivel închis FCB 1 |
6C-7F | 20 de octeți | Nivel FCB închis (suprascris dacă FCB 1 este deschis) |
80 | 1 octet | Numărul de caractere pe linia de comandă |
81-FF | 127 de octeți | Linia de comandă (termină 0Dh ) |
PSP (Zero-Page sau Base Page) în CP/M-86
Decalaj | mărimea | Cuprins |
---|---|---|
00-02 | 3 octeți | Lungimea grupului de coduri în octeți |
03-04 | cuvânt mașină | Adresa segmentului grupului de coduri |
05 | octet | Steagul model 8080 - setat dacă programul este într-un singur segment |
06-08 | cuvânt mașină | Lungimea grupului de date în octeți |
09-0A | cuvânt mașină | Adresa segmentului grupului de date |
0B | octet | rezervat |
0C-11 | Descriptor de grup suplimentar - format ca pentru grupul de date | |
12-17 | Descriptor de grup de stivă - același format ca și grupul de date | |
18-1D | Descriptor de grup X1 - format ca pentru un grup de date | |
1E-23 | Descriptor de grup X2 - format ca pentru un grup de date | |
24-29 | Descriptor de grup X3 - format ca pentru un grup de date | |
2A-2F | Descriptor de grup X4 - format ca pentru un grup de date | |
30-4F | rezervat | |
cincizeci | octet | Disc de pe care a fost încărcat programul (CP/M 3) |
51-52 | cuvânt mașină | Adresa parolei pentru primul FCB (CP/M 3) |
53 | octet | Lungimea parolei pentru primul FCB (CP/M 3) |
54-55 | cuvânt mașină | Adresa parolei pentru al doilea FCB (CP/M 3) |
56 | octet | Lungimea parolei pentru al doilea FCB (CP/M 3) |
57-5B | octeți | rezervat |
5C-6B | FCB implicit 1 | |
6C-7F | FCB 2 implicit (suprascris dacă CB 1 este deschis) | |
80 | octet | Numărul de caractere pe linia de comandă |
81-FF | octeți | Linie de comanda |
PSP este cel mai frecvent folosit pentru a primi argumente din linia de comandă a unui program DOS, de exemplu, comanda „foo.exe -a -f” va executa (rula) fișierul foo.exe cu argumentele „-a” și „ -f'.
Adresa segmentului PSP va fi introdusă în registrul DS în momentul în care programul este executat. De asemenea, poate fi definit ulterior folosind întreruperea #21h a subfuncției #62h. Această întrerupere va returna adresa PSP-ului în registrul BX. [unu]
De asemenea, în programele .COM , puteți accesa PSP-ul direct folosind offset-urile din lista de mai sus. 00h indică începutul PSP, FFh indică sfârșitul și așa mai departe. De exemplu, următorul cod afișează argumentele liniei de comandă:
org 100h _ ; int 21h subfuncția 9 necesită „$” pentru a termina șirul xor bx , bx mov bl , [ 80 h ] mov byte [ bx + 81h ] , ' $ ' ; ieșire de linie muta ah , 9 mov dx , 81 h int 21h _ ; completare mov ax , 4C00h _ int 21h _