Předpona segmentu programu - Program Segment Prefix

Program Segment předpona (PSP) je datová struktura, použitý v DOS systémy pro uložení stavu do programu . Podobá se Zero Strana v CP / M operační systém. PSP má následující strukturu:

Offsetové obrázky Velikost Obsah
00h-01h 2 bajty (kód) Výstup podobný CP/M -80 (vždy obsahuje INT 20h )
02h-03h slovo (2 bajty) Segment prvního bajtu mimo paměť přidělenou programu
04h byte Rezervováno
05h-09h 5 bytů (kód) CP/M-80 jako vzdálený vstup do DOS a velikost segmentu programu
0Ah-0Dh dword (4 bajty) Ukončit adresu předchozího programu (starý INT 22h )
0Eh-11h dword Adresa přerušení předchozího programu (starý INT 23h )
12h-15h dword Adresa kritické chyby předchozího programu (starý INT 24h )
16h-17h slovo Segment PSP rodičů (obvykle COMMAND.COM - interní)
18h-2Bh 20 bajtů Tabulka úloh (JFT) (interní)
2Ch-2Dh slovo Segment životního prostředí
2Eh-31h dword SS: SP při vstupu do posledního hovoru INT 21h (interní)
32h-33h slovo Velikost JFT (interní)
34h-37h dword Ukazatel na JFT (interní)
38h-3Bh dword Ukazatel na předchozí PSP (používá pouze SHARE v DOS 3.3 a novějších)
3Ch-3Fh 4 byty Rezervováno
40h-41h slovo Vrátit verzi DOS (DOS 4 a novější, lze změnit pomocí SETVER v DOS 5 a novějších)
42h-4Fh 14 bajtů Rezervováno
50h-52h 3 bajty (kód) Unixový vzdálený vstup do DOSu (vždy obsahuje INT 21h + RETF)
53h-54h 2 bajty Rezervováno
55h-5Bh 7 bajtů Rezervováno (lze použít k přeměně prvního FCB na rozšířený FCB)
5Ch-6Bh 16 bajtů Neotevřený standard FCB 1
6Ch-7Fh 20 bajtů Neotevřený standard FCB 2 (přepsán, pokud je otevřen FCB 1)
80 h 1 bajt Počet bajtů na příkazovém řádku
81h-FFh 127 bajtů Ocas příkazového řádku (ukončen 0Dh )

PSP se nejčastěji používá k získání argumentů příkazového řádku programu DOS; například příkaz "FOO.EXE /A /F" spustí FOO.EXE s argumenty ' /A' a ' /F'.

Pokud je položka PSP pro délku příkazového řádku nenulová a ukazatel na segment prostředí není ani 0000h, ani FFFFh, programy by se měly nejprve pokusit načíst příkazový řádek z proměnné prostředí % CMDLINE %, než jej extrahují z PSP. Tímto způsobem je možné předávat aplikacím příkazové řádky delší než 126 znaků.

Adresa segmentu PSP je předána do registru DS při spuštění programu. Lze ji také určit později pomocí funkce Int 21h 51h nebo Int 21h funkce 62h. Každá funkce vrátí adresu PSP v registru BX.

Alternativně v programech .COM načtených s ofsetem 100hlze přímo oslovit PSP pouze pomocí výše uvedených offsetů. Offset 000hukazuje na začátek PSP, 0FFhukazuje na konec atd.

Následující kód například zobrazuje argumenty příkazového řádku:

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

V DOS 1.x bylo nutné, aby registr CS (Code Segment) obsahoval stejný segment jako PSP při ukončení programu, takže standardní programovací postup zahrnoval uložení registru DS do zásobníku na začátku programu (protože registr DS je načten segmentem PSP) a ukončení programu instrukcí RETF, která vyskočí uloženou hodnotu segmentu ze zásobníku a skočí na adresu 0 PSP, která obsahovala instrukci 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

Pokud byl spustitelným souborem .COM, nebyl tento postup zbytečný a program mohl být ukončen pouze přímou instrukcí INT 20h nebo jiným voláním funkce INT 21h Function 0. Programátor však stále musel zajistit, aby registr CS obsahoval adresu segmentu PSP při ukončení programu. Tím pádem,

jmp   start

mess1 db 'Hello world!$'

start:
mov   dx,mess1
mov   ah,9
int   21h

int   20h

V systému DOS 2.x a vyšším bylo místo toho provedeno ukončení programu pomocí funkce INT 21h Function 4Ch, která nevyžadovala, aby registr CS obsahoval hodnotu segmentu PSP.

Viz také

Reference

Další čtení

externí odkazy