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é
- Nulová stránka (CP/M)
- CALL 5 (DOS)
- Rámeček zásobníku (Unix)
- Adresář procesů (Multics)
- Identifikátor procesu (PID)
- toto (počítačové programování)
- Vlastní reference
Reference
Další čtení
- 86 -DOS - Diskový operační systém pro 8086 - Příručka programátora (PDF) . Verze 0.3 (předběžné vydání). Seattle, Washington, USA: Seattle Computer Products, Inc. 1980. Archivováno z originálu (PDF) na 2019-06-23 . Citováno 2011-09-13 . (41 stran)
- „Formát předpony segmentu programu (PSP)“ . INTER61 . 2000. Archivováno od originálu dne 2020-02-17 . Citováno 2019-12-19 .
- Schäpers, Arne (1991). „Kapitel 5: EXEC im Detail - Program Segment Prefix (PSP)“. Programátor DOS 5: Die endgültige Referenz (v němčině) (1. vydání). Addison Wesley (Deutschland) GmbH . s. 148–151, 971–972. ISBN 3-89319-350-2. (1123 stránek+v, skládací, 5,25 "-disketa)
externí odkazy
- Přístup k argumentům příkazového řádku (Microsoft.com)