Předpona segmentu programu - Program Segment Prefix
The Předpona segmentu programu (PSP) je datová struktura používaná v DOS systémy pro ukládání stavu a program. Připomíná to Nulová stránka v CP / M operační systém. PSP má následující strukturu:
Offsetimages | Velikost | Obsah |
---|---|---|
00h-01h | 2 bajty (kód) | CP / M-80 -jako exit (vždy obsahuje INT 20h )[1] |
02h-03h | slovo (2 bajty) | Segment prvního bajtu mimo paměť přidělenou programu |
04h | byte | Rezervováno |
05h-09h | 5 bajtů (kód) | CP / M-80 vzdálený vstup do systému DOS a velikost segmentu programu[1][2] |
0Ah-0Dh | dword (4 byty) | 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 24 hodin ) |
16h-17h | slovo | Rodičovský segment PSP (obvykle COMMAND.COM - interní) |
18h-2Bh | 20 bytů | Tabulka souborů úloh (JFT) (interní) |
2Ch-2Dh | slovo | životní prostředí segment |
2Eh-31h | dword | SS: SP při vstupu do konce INT 21h hovor (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 DOSu 3.3 a novějších) |
3Ch-3Fh | 4 byty | Rezervováno |
40h - 41h | slovo | DOS verze k návratu (DOS 4 a novější, měnitelné přes SETVER v DOS 5 a novější) |
42h-4Fh | 14 bajtů | Rezervováno |
50h-52h | 3 bajty (kód) | Unix - jako daleký vstup do DOSu (vždy obsahuje INT 21h + RETF) |
53h-54h | 2 bajty | Rezervováno |
55h-5Bh | 7 bytů | Vyhrazeno (lze použít k vytvoření prvního FCB do rozšířeného FCB) |
5Ch-6Bh | 16 bytů | Neotevřený standard FCB 1 |
6Ch-7Fh | 20 bytů | Neotevřený standard FCB 2 (přepsán, pokud je otevřen FCB 1) |
80h | 1 bajt | Počet bajtů na příkazovém řádku |
81h-FFh | 127 bytů | Ocas příkazového řádku (ukončený a 0Dh )[3][4] |
PSP se nejčastěji používá k získání argumenty příkazového řádku programu DOS; například příkaz "FOO.EXE / A / F" provede 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, měly by se programy nejprve pokusit načíst příkazový řádek z proměnná prostředí % CMDLINE% před extrakcí z PSP. Tímto způsobem je možné předávat aplikacím příkazové řádky delší než 126 znaků.
Když je program spuštěn, je v registru DS předána adresa segmentu PSP. Lze jej také určit později pomocí funkce Int 21h 51h nebo funkce Int 21h 62h. Každá funkce vrátí adresu PSP v registru BX.[5]
Případně v .COM programy načtené s offsetem 100h, lze PSP oslovit přímo pouhým použitím offsetů uvedených výše. Ofset 000h poukazuje na začátek PSP, 0FFh ukazuje na konec atd.
Například následující kód zobrazuje argumenty příkazového řádku:
org 100h ; .COM - nepoužívá ds; INT 21h dílčí funkce 9 vyžaduje '$' k ukončení řetězcexor bx,bxmov bl,[80h]cmp bl,7Eh ja výstup ; zabránění přetečenímov byte [bx+81h],'$'; vytiskněte řetězecmov ah,9mov dx,81hint 21hvýstup:mov sekera,4C00h ; podfunkce 4Cint 21h
V DOS 1.x bylo nutné, aby registr CS (Code Segment) obsahoval na konci programu stejný segment jako PSP, takže standardní programovací praxe zahrnovala uložení registru DS do zásobníku na začátku programu (protože registr DS je načteno segmentem PSP) a ukončení programu instrukcí RETF, která by vyskočila uloženou hodnotu segmentu ze zásobníku a skočila na adresu 0 PSP, která obsahovala instrukci INT 20h.
; Uložittlačit dsxor sekera,sekeratlačit sekera; přejít na výchozí datovou skupinu (@data)mov sekera,@datamov ds,sekera; tisknout zprávu v mess1 (21h dílčí funkce 9)mov dx,nepořádek1mov ah,9int 21hretf
Pokud byl spustitelným souborem soubor .COM, byl tento postup zbytečný a program mohl být ukončen pouze přímou instrukcí INT 20h nebo voláním funkce INT 21h 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 Startnepořádek1 db „Ahoj světe! $“Start:mov dx,nepořádek1mov ah,9int 21hint 20h
V systému DOS 2.xa vyšším bylo ukončení programu provedeno místo toho s funkcí INT 21h 4Ch, která nevyžadovala, aby registr CS obsahoval hodnotu segmentu PSP.
Viz také
- Nulová stránka (CP / M)
- VOLEJTE 5 (DOS)
- Stohový rám (Unix)[6]
- Zpracovat adresář (Multics)[6]
- Identifikátor procesu (PID)[6]
- toto (počítačové programování)
- Vlastní reference
Reference
- ^ A b Taylor, Roger; Lemmons, Phil (červen 1982). „Nahoru migrace - Část 1: Překladatelé - Použití překladatelských programů k přesunu programů CP / M-86 do CP / M a MS-DOS“ (PDF). BYTE. Sv. 7 č. 6. BYTE Publications Inc. s. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN 0360-5280. KÓD BYTEDJ. Archivováno (PDF) od původního dne 2020-01-16. Citováno 2020-01-15.
[…] Získání přístupu k CP / M-86 […] Získání přístupu k CP / M-86 vyžaduje umístění funkčního kódu do registru CL, umístění parametru byte do registru DL nebo umístění parametru word do registru DX, umístění datového segmentu do registru DS (data segment se u převedeného programu obvykle nezmění) a provedení softwarového přerušení, INT # 224. Výsledek je vrácen v registru AL, pokud se jedná o hodnotu bajtu; pokud je výsledkem slovní hodnota, je vrácena v registrech AX i BX. Hodnoty dvou slov jsou vráceny s posunem v registrech BX a segmentem v registru ES. Převod programů z CP / M-80 na CP / M-86, pak vyžaduje nahrazení volání na místo 5 softwarovým přerušením INT # 224. Další nezbytná změna zahrnuje teplá bota. Pod CP / M-80 může být teplá bota přístupná systémovým voláním s kódem funkce 0 pro skok na místo O. CP / M-86 však nepodporuje skok na místo O. Výsledkem je , musíte tento programový výstup v přeloženém programu změnit, pokud má program fungovat správně. Za předpokladu, že je volání na místo 5 nahrazeno INT # 224, že dojde ke změně teplého bootování a že jsou registry správně namapovány, by měl být malý problém v získání přeloženého programu pro přístup k funkcím systému CP / M-86 . […] Získání přístupu k MS-DOS […] Ačkoli má MS-DOS „preferovaný“ mechanismus prostřednictvím přerušení softwaru, INT # 33, pro přístup do systému je poskytován další mechanismus pro „již existující“ programy, který je kompatibilní s konvencemi volání CP / M-80, alespoň pro funkce v rozsahu 0-36. Pokud jde o systémová volání v povoleném rozsahu funkcí, programátor nemusí dělat nic s přeloženými programy, aby je spustil pod MS-DOS, než aby správně mapoval registry. MS-DOS také podporuje funkci teplého startu CP / M-80. Skok na místo 0 v systému MS-DOS provede softwarové přerušení, INT # 32, což je funkčně konec programu a běžný způsob ukončení programu. […]
[1] [2][3][4][5][6][7][8][9][10][11][12][13][14] (13 stránek) - ^ Nečasek, Michal (13. 9. 2011). „Kdo vlastně potřebuje adresu adresy?“. Muzeum OS / 2. Archivováno z původního dne 2020-02-19. Citováno 2020-02-19.
[…] 86-DOS, a tedy PC DOS /MS-DOS, použil chytrý trik. Bajt na offsetu 5 PSP obsahoval opcode vzdáleného volání (9Ah); slovo na offsetu 6 PSP obsahovalo příslušnou hodnotu pro označení velikosti segmentu programu a také offsetovou část vzdáleného volání. Slovo na offsetu 8, které sloužilo jako segmentová část volání na dálku, bylo vytvořeno tak, aby se v kombinaci s offsetem obtáčelo (dobře pochopený rys 8086 CPU) a přejděte na adresu 0: C0h, která obsahuje vektor přerušení 30h. […] VOLEJTE 5 rozhraní funguje i v emulaci DOS pod Windows NT a OS / 2 a tyto systémy s největší pravděpodobností nemohou běžet s Linka A20 zakázán. Jak to potom funguje? […] Místo sekání adresních bitů systém zrcadlí pět bajtů při 0: C0h při 1000C0h. Stejná technika byla ve skutečnosti použita v systému DOS 5 a novějších DOS = VYSOKÝ. V takovém případě systém DOS zajistí, aby lineární adresa 1000C0h obsahovala příslušné vzdálené volání. […]
- ^ Paul, Matthias R. (01.07.1997) [01.01.1994]. MSDOSTIPs - Tips für den Umgang mit MS-DOS 5.0-7. MPDOSTIP (v němčině). Archivováno od originálu na 2017-08-22. Citováno 2013-10-25. (Pozn. MSDOSTIP.TXT je součástí MPDOSTIP.ZIP, udržovaného až do roku 2001 a distribuovaného na mnoha webech v té době. Poskytnutý odkaz odkazuje na starší verzi souboru MSDOSTIP.TXT převedenou na HTML.) [15]
- ^ Paul, Matthias R. (01.05.1997) [01.03.1995]. „Hinweise zu JPSofts 4DOS 5.5b / c, 5.51, 5.52a und NDOS“. MPDOSTIP (v němčině). Archivováno z původního dne 2016-11-04. Citováno 2015-05-08. (Pozn. Uvedený odkaz odkazuje na verzi HTML převedenou na verzi
4DOS5TIP.TXT
soubor, který je součástí souboruMPDOSTIP.ZIP
sbírka.) [16] - ^ „INT 21h, 62h - Získejte adresu PSP (DOS 3.x)“. Archivovány od originál dne 02.02.2012.
- ^ A b C Schulman, Andrew; Brown, Ralf D.; Maxey, David; Michels, Raymond J .; Kyle, Jim (1994) [listopad 1993]. Nedokumentovaný DOS: Programátorský průvodce vyhrazenými funkcemi a datovými strukturami systému MS-DOS - rozšířen o MS-DOS 6, Novell DOS a Windows 3.1 (2. vyd.). Reading, Massachusetts, USA: Addison Wesley. ISBN 0-201-63287-X. ISBN 978-0-201-63287-3. (stránky xviii + 856 + vi, 3,5 "disketa) Chyba: [17][18]
Další čtení
- 86-DOS - Disk Operating System for the 8086 - Programmer's Manual (PDF). Verze 0.3 (předběžné vydání). Seattle, Washington, USA: Seattle Computer Products, Inc. 1980. Archivovány od originál (PDF) dne 23.06.2019. Citováno 2011-09-13. (41 stránek)
- "Formát prefixu programového segmentu (PSP)". INTER61. 2000. Archivováno od původního dne 2020-02-17. Citováno 2019-12-19.
- Schäpers, Arne (1991). "Kapitel 5: EXEC im Detail - Program Segment Prefix (PSP)". DOS 5 pro programátory: Die endgültige Referenz (v němčině) (1. vyd.). Addison Wesley (Deutschland) GmbH. str. 148–151, 971–972. ISBN 3-89319-350-2. (1123 + v stránek, rozkládací, 5,25 "disketa)
externí odkazy
- Přístup k argumentům příkazového řádku (Microsoft.com)