Prefixul segmentului de program

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 29 martie 2018; verificările necesită 8 modificări .

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 _

Note

  1. INT 21.62 - Obține adresa PSP (DOS 3.x) (downlink) . Arhivat din original pe 26 aprilie 2012. 

Link -uri