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 000hindică începutul PSP, 0FFhindică 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

Referințe

Lecturi suplimentare

linkuri externe