COM (fájlformátum)
| COM | |
| Fájlkiterjesztés | .com |
| MIME-típus | application/octet-stream; charset=binary |
A .COM kiterjesztésű fájl egy egyszerű végrehajtható fájltípus. Az 1970-es évekbeli Digital Equipment Corporation (DEC) VAX operációs rendszereiben a .COM kiterjesztést olyan szöveges fájlok nevéhez használták, amelyek az operációs rendszernek kiadandó parancsokat tartalmaztak (hasonlóan a kötegelt fájlokhoz).[1] A Digital Research CP/M (a PDP-10-hez készült TOPS-10 mintájára készült mikroszámítógépes operációs rendszer) bevezetésével a COM kiterjesztéssel általában társított fájltípus végrehajtható fájlokká változott. Ezt a konvenciót később átvették a DOS-ba is. Még akkor is, amikor kiegészült a végrehajtható fájlok általánosabb EXE fájlformátumával, a kompakt COM fájlok továbbra is használhatóak maradtak és gyakran használták őket a DOS alatt.
A .COM fájlnévkiterjesztésnek nincs köze a .com (a „commercial” rövidítése) legfelső szintű internetes domain névhez. A név hasonlóságát azonban a rosszindulatú programok írói kihasználták.
DOS bináris formátum
[szerkesztés]A COM formátum az eredeti bináris végrehajtható formátum, amelyet a CP/M (beleértve az SCP és az MSX-DOS) és a DOS is használ. Nagyon egyszerű: nincs fejléc (a CP/M 3 fájlok kivételével),[2] és nem tartalmaz szabványos metaadatokat, csak kódot és adatokat. Ez az egyszerűségnek ára van: a bináris fájl maximális mérete 65 280 (FF00h) bájt (256 bájttal kevesebb, mint 64 KiB), és az összes kódot és adatot egy szegmensben tárolja.
Mivel nincs áthelyezési információja, az operációs rendszer egy előre beállított címre, a PSP-t közvetlenül követő 0100h eltolással tölti be, ahol végrehajtásra kerül (innen a végrehajtható fájl méretének korlátozása): a belépési pont 0100h-ra van rögzítve.[nb 1] Ez nem jelentett problémát a 8 bites gépeken, mivel azok csak 64 kB memóriát tudnak címezni, de a 16 bites gépek sokkal nagyobb címterülettel rendelkeznek, ezért ez a formátum kiment a használatból.
Az Intel 8080 CPU architektúrában csak 65 536 bájt memória címezhető (0000h és FFFFh címtartomány). A CP/M alatt ennek a memóriának az első 256 bájtja, 0000h-tól 00FFh-ig, a nullás oldal által rendszerhasználatra volt fenntartva, és minden felhasználói programot pontosan 0100h-ra kellett betölteni a végrehajtáshoz.[nb 1] A COM fájlok tökéletesen illeszkedtek ehhez a modellhez. Az MP/M és a Concurrent CP/M bevezetése előtt nem volt lehetőség egyszerre több programot vagy parancsot futtatni: a 0100h-ra betöltött program futott, és semmi más.
Bár a fájlformátum a DOS-ban és a CP/M-ben azonos, a két operációs rendszer .COM fájljai nem kompatibilisek egymással; a DOS COM fájlok x86 utasításokat és esetleg DOS rendszerhívásokat tartalmaznak, míg a CP/M COM fájlok 8080 utasításokat és CP/M rendszerhívásokat tartalmaznak (bizonyos gépekre korlátozott programok további utasításokat is tartalmazhatnak 8085 vagy Z80 számára).
A DOS-ban a .COM fájlok az összes x86 szegmensregisztert ugyanarra az értékre állítják, az SP (stack pointer) regisztert pedig az első 64 KiB szegmensben elérhető utolsó szó eltolására (jellemzően FFFEh) vagy a program betöltésére szolgáló blokkban elérhető memória maximális méretére, mind a program, mind a legalább 256 bájtos verem esetében, amelyik kisebb, így a verem a megfelelő memóriaszegmens legfelső részén kezdődik, és onnan lefelé halad.[3][4]
Az eredeti DOS 1.x API-ban, amely a CP/M API származéka volt, a .COM fájlok programzárását az INT 20h (Terminate Program) függvény vagy az ugyanerre a célra szolgáló INT 21h Function 0 függvény hívásával hajtották végre, és a programozónak azt is biztosítania kellett, hogy a kód- és adatszegmens-regiszterek a programzáráskor ugyanazt az értéket tartalmazzák, hogy elkerülhető legyen a rendszer lehetséges összeomlása. Bár ez bármely DOS verzióban használható volt, a Microsoft a DOS 2.x-től kezdve az INT 21h Function 4Ch használatát javasolta a programok befejezéséhez, amely nem igényelte, hogy az adat- és kódszegmens ugyanazt az értéket tartalmazzon.
Lehetséges olyan .COM fájlt készíteni, amely mindkét operációs rendszer alatt futtatható fat binary formátumban. Az utasítások szintjén nincs valódi kompatibilitás; a belépési ponton lévő utasításokat úgy választják meg, hogy funkciójukban egyformák legyenek, de mindkét operációs rendszerben különbözőek, és a program végrehajtását a használt operációs rendszer szakaszába ugorják. Alapvetően két különböző programról van szó, amelyek ugyanazt a funkciót látják el egy fájlban, és előttük egy kód választja ki, melyiket kell használni.
CP/M 3 alatt, ha a COM fájl első bájtja C9h, akkor van egy 256 bájtos fejléc;[2] mivel a C9h a 8080 RET utasításnak felel meg, ez azt jelenti, hogy a COM fájl azonnal leáll, ha egy korábbi CP/M verzión fut, amely nem támogatja ezt a kiterjesztést. (Mivel a 8085 és a Z80 utasításkészletei a 8080 utasításkészlet szuperkészletei, ez mindhárom processzoron működik.) A C9h érvénytelen opkód az 8088/8086-on, azonban a LEAVE opkódja a 80188/80186 óta. Bár lehetséges, a LEAVE valószínűleg nem lesz az első utasítás egy érvényes programban. Ezért a DOS egyes verzióinak futtatható betöltője elutasítja a C9h-val kezdődő COM fájlokat, elkerülve ezzel a rendszer összeomlását.
A fájlok neve .COM-mal végződhet, de nem feltétlenül a fent leírt egyszerű formátumban; ezt a fájl elején található mágikus szám jelzi. Például a DR DOS 6.0 COMMAND.COM fájlja valójában DOS végrehajtható formátumú, amit az első két bájt 4D 5A (ASCII-ben MZ) jelöl, ami Mark Zbikowski kezdőbetűi.
Nagy programok
[szerkesztés]A DOS alatt a betöltő vagy a végrehajtási környezet nem biztosít memóriakezelést a COM fájlok számára. Az összes memória egyszerűen elérhető a COM fájl számára. A végrehajtás után az operációs rendszer parancssor-héj, a COMMAND.COM újra betöltődik. Ez lehetőséget ad arra, hogy a COM fájl vagy nagyon egyszerű legyen, egyetlen szegmenst használjon, vagy tetszőlegesen bonyolult, saját memóriakezelő rendszerrel rendelkezzen. Egy komplex program példája a COMMAND.COM, a DOS shell, amely betöltőt biztosított más COM vagy EXE programok betöltéséhez. A .COM rendszerben nagyobb programok (a rendelkezésre álló memóriaméretig) betölthetők és futtathatók, de a rendszer betöltője feltételezi, hogy az összes kód és adat az első szegmensben található, és a további szervezés a .COM program feladata. A rendelkezésre álló memóriánál nagyobb programok vagy nagy adatszegmensek dinamikus linkeléssel kezelhetők, ha a szükséges kód szerepel a .COM programban. A .COM formátum használatának előnye a .EXE formátummal szemben, hogy a bináris kép általában kisebb és könnyebben programozható assembler segítségével.[5] Miután elegendő teljesítményű fordítók és linkelők váltak elérhetővé, már nem volt előnyös a .COM formátum használata komplex programokhoz.
Megjegyzés
[szerkesztés]- ↑ a b A CP/M legtöbb verziójában a TPA kezdete +100h eltolással volt, amelyet a memóriában csak a +0h eltolással rendelkező zero page előzött meg. Néhány verzió hardveres okokból eltért ettől, például a Heath H89 CP/M, ahol a +4300h eltolással kezdődött (a kompatibilitás érdekében a Magnolia Microsystems hardveres módosítást hajtott végre, hogy a ROM-okat a rendszerindítás után +100h-ra térképezze fel), vagy a CP/M TRS-80 Model I és TRS-80 Model III, ahol a programokat +0h eltolással töltötték be.
Jegyzetek
[szerkesztés]- ↑ Section 5.3, The PDP-11 How-To Book, Revision 1 (NB. Has a reference for the RT-11 operating system running on the PDP-11 minicomputer, which shows in section 5.3 that .COM is used to refer to a command file.)
- ↑ a b CP/M 3 COM file header. Seasip.info, 2002 [2018. augusztus 1-i dátummal az eredetiből archiválva].
- ↑ (2002. október 7.). „Re: Run a COM file”. alt.msdos.programmer. (Web link). [1] (NB. Has details on the DOS COM program calling conventions.)
- ↑ DOS .COM startup registers. Forever Young Software, 2020 [2020. november 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2021. december 14.)
- ↑ Chapter 2, Assembly Language Subroutines for MS-DOS, 2, Windcrest Books, 16. o. (1991. március 5.). ISBN 0-8306-7649-X