Intel HEX
Az Intel HEX fájlformátum mikrokontrollerek, EPROM-ok vagy egyéb más programozható chipek tartalmának tárolására szolgál. Ez az egyik legrégebbi, erre a célra használható fájlformátum, amelyet már az 1970-es évek óta alkalmaznak.
A fájlformátuma szöveges fájl, amelynek minden sora egy adatsort és a hozzá tartozó címet tartalmazza. Az Intel HEX fájlnak háromféle típusa létezik: 8 bites, 16 bites, és 32 bites, amelyek a bájtsorrendjükben eltérőek.
Adatsor felépítése
[szerkesztés]Az Intel HEX fájlok minden sora 6 mezőből áll:
1. | Start kód | 1 bájt ASCII | egy karakter, egy ASCII kettőspont ":" |
2. | Bájtok száma | 2 hexadecimális számjegy | bájtok száma (hexadecimális kétjegyű számok) az adatmezőben. Ez általában 16 (0x10) vagy 32 (0x20) bájtnyi adat. |
3. | Cím | 4 hexadecimális számjegy | 16 biten megadja az adatok kezdőcímét a memóriában. A maximális címtartomány 64 kB, ezt úgy lehet túllépni, hogy a magasabb biteket további rekord típusokon keresztül adjuk meg. A cím "big endian" formátumú, a cím végén van az MSB (Most Significant Byte - Legnagyobb értékű bájt). |
4. | Rekord típusa | 2 hexadecimális számjegy | értéke 00-tól 05-ig adható meg, az adat mező típusát adja meg. |
5. | Adat | n hexadecimális számjegy | n/2 bájtból álló adatsor, az adat maga (1 bájt 2 hexadecimális számjeggyel adható meg, pl. 255 = FFh). |
6. | Ellenőrző összeg | 2 hexadecimális számjegy | az összes mező 2-es komplemensben vett összegének - kivéve az 1. és 6. - LSB-je. Számítása úgy történik, hogy összeadjuk a hexadecimálisan megadott bájtokat, majd az összegnek vesszük az LSB-jét (Least Significant Byte - Legkisebb értékű bájt), és ezt vagy kivonjuk 0x100-ból vagy invertáljuk (XOR 0xFF-fel) és hozzáadunk 1-et (ez lényegében az LSB 2-es komplemensének előállítása). Ezután a végeredményt AND-eljük 255-tel mivel 0x100-0 és (0x00 XOR 0xFF)+1 is egyenlő 0x100-zal, és ha nem 8 bites változókkal dolgozunk, akkor az overflow-t (túlcsordulást) el kell hagyni. Ha az ellenőrzőösszeg megfelelően van kiszámítva, akkor soronként minden egyes bájtot összeadva (a Bájtok számát, a Cím mindkét bájtját, a Rekord típust, minden Adat bájtot és az Ellenőrző összeget), akkor a végeredmény LSB-jének értéke 0x00 kell, hogy legyen. |
Példa
[szerkesztés]
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
Rekordtípusok
[szerkesztés]Hatféle rekordtípus lehetséges:
00 | adat rekord Adatot és 16 bites címet tartalmaz. |
---|---|
01 | End Of File (fájl vége) rekord A fájl végét jelölő rekord. Adatot nem tartalmaz. Ennek kell lennie a fájl utolsó sorának, csak egy ilyen engedélyezett fájlonként. Általában ':00000001FF'. Eredetileg az End Of File (fájl vége) rekord tartalmazhatta a program kezdőcímét, pl. a :00AB2F0123 ugrást hajtott végre az AB2F címre. Ez akkor volt használatos, amikor a programokat lyukszalagról olvasták be. |
02 | Kiterjesztett szegmenscím rekord, szegmens báziscím. Akkor használatos, amikor a 16 bites címtartomány nem elég, megfelel a 80x86 valós módú címzésnek. A cím a 02-es rekordban megszorzódik 16-tal (4 bites eltolás balra) és hozzáadódik a következő 00-s rekordban megadott címhez. Így a maximális megcímezhető tartomány 1 MB-ra tolódik. Ennek a rekordnak Cím mezője 0000-t kell – hogy tartalmazzon, a Bájtok száma pedig 02-t (mivel a szegmens 16 bites). A szegmenscím legalacsonyabb értékű számjegye mindig 0. |
03 | Kezdő szegmenscím rekord. A 80x86 processzoroknál meghatározza a CS:IP regiszterek kezdőtartalmát. A Cím mező 0000, a Bájtok száma 04, az első két bájt a kódszegmens (CS), az utolsó kettő pedig az utasítás mutató (IP) értékét adja meg. |
04 | Kiterjesztett lineáris cím rekord Teljes 32 bites címzést tesz lehetővé. A Cím mező 0000, a Bájtok száma 02. A két adatbájt ebben az esetben a 32 bites cím felső 16 bitjét adja meg, az alsó 16 bit pedig a 00 rekord Cím mezőjében található. |
05 | Lineáris címzés kezdete rekord. A Cím mező 0000, a Bájtok száma mező 04. A 4 adatbájt tartalmazza a 32 bites címet a 80386 vagy attól újabb processzorok EIP regisztere számára. |
Formátumok
[szerkesztés]A formátumnak több altípusa létezik:
- I8HEX vagy INTEL 8, 8 bites formátum.
- I16HEX vagy INTEL 16, 16 bites formátum. Engedélyezi a 02-es rekordok használatát. Az Adat mező bájtsorrendje fordított lehet.
- I32HEX vagy INTEL 32, 32 bites formátum. Engedélyezi a 03, 04, és 05-ös rekordok használatát. Az Adat mező bájtsorrendje fordított lehet.
Vigyázat! A fordított bájtsorrendű adat megtévesztő lehet. Könnyen előfordulhat a bájtsorrend helytelen értelmezése az I16HEX és I32HEX altípusok esetén.
Egy hasonló kódolású, de eltérő ASCII formátumú, SREC-nek nevezett formátum pedig a Motorola processzorok esetén használatos.
Külső hivatkozások
[szerkesztés]- Intel Hexadecimal Object File Format Specification 1988 (PDF)
- Format description at PIC List
- Format description
- SRecord, multi-platform GPL eszköz EPROM fájlok szerkesztésére.
- Binex, Intel HEX ↔ bináris konverter.