Intel HEX

Intel hex
Filnamnstillägg
.hex , .h86 , .hxl , .hxh , .obl , .obh , .mcs , .ihex , .ihe , .ihx , .a43 , .a90 , .p00 till .pff

Intel hexadecimala objektfilformat , Intel hex-format eller Intellec Hex är ett filformat som förmedlar binär information i ASCII - textform . Det används vanligtvis för programmering av mikrokontroller , EPROM och andra typer av programmerbara logiska enheter och hårdvaruemulatorer . I en typisk applikation konverterar en kompilator eller assembler ett programs källkod (som i C eller assemblerspråk ) till maskinkod och matar ut den till en HEX-fil. Vissa använder det också som ett containerformat som innehåller paket med strömdata . Vanliga filtillägg som används för de resulterande filerna är .HEX eller .H86. HEX-filen läses sedan av en programmerare för att skriva maskinkoden i en PROM eller överförs till målsystemet för laddning och exekvering.

Historia

Intel hex-formatet designades ursprungligen för Intels Intellec Microcomputer Development Systems (MDS) 1973 för att ladda och köra program från papperstejp . Den användes också för att specificera minnesinnehåll till Intel för ROM-produktion. 1973 bestod Intels "mjukvarugrupp" endast av Bill Byerly och Ken Burget, och Gary Kildall som extern konsult. Med början 1975 användes formatet av MCS Series II ISIS-II- system, med filtillägget HEX. Många PROM- och EPROM- programmeringsenheter accepterade detta format.

Formatera

Intel HEX består av rader med ASCII -text som är åtskilda av radmatning eller vagnretur eller båda. Varje textrad innehåller hexadecimala tecken som kodar flera binära tal. De binära talen kan representera data, minnesadresser eller andra värden, beroende på deras position på raden och typen och längden på raden. Varje textrad kallas en post .

Rekordstruktur

En post (textrad) består av sex fält (delar) som visas i ordning från vänster till höger:

  1. 0 Startkod , ett tecken, ett ASCII-kolon ' : ' . Alla tecken som föregår denna symbol i en post ska ignoreras. Faktum är att mycket tidiga versioner av specifikationen bad om minst 25 NUL- tecken för att föregå den första posten och följa den sista. Men eftersom detta var en lite känd del av specifikationen, klarar inte all mjukvara som skrivits detta korrekt. Det gör det möjligt att lagra annan relaterad information i samma fil (och till och med samma rad), en funktion som används av olika programvaruutvecklingsverktyg för att lagra symboltabeller eller ytterligare kommentarer, och tredjepartstillägg som använder andra tecken som startkod som siffran ' ' av Keil , ' $ ' av Mostek , eller ' ! ', ' @ ', ' # ', ' \ ', ' & ' och ' ; ' av TDL . Enligt konventionen används ' // ' ofta för kommentarer. Ingen av dessa tillägg får innehålla några ':'-tecken som en del av nyttolasten.
  2. Byte count , två hexadecimala siffror (ett hexadecimalt sifferpar), som indikerar antalet byte (hexadecimalt par) i datafältet. Det maximala antalet byte är 255 (0xFF). 8 (0x08), 16 (0x10) och 32 (0x20) är vanliga byte-antal. Inte all programvara klarar av fler än 16.
  3. Adress , fyra hexadecimala siffror, representerar den 16-bitars startminnesadressförskjutningen för datan. Den fysiska adressen för datan beräknas genom att lägga till denna förskjutning till en tidigare etablerad basadress, vilket möjliggör minnesadressering utöver gränsen på 64 kilobyte för 16-bitars adresser. Basadressen, som som standard är noll, kan ändras av olika typer av poster. Basadresser och adressoffset uttrycks alltid som stora endianvärden .
  4. Posttyp (se posttyper nedan), två hexadecimala siffror, 00 till 05 , som definierar betydelsen av datafältet.
  5. Data , en sekvens av n byte data, representerad av 2 n hexadecimala siffror. Vissa poster utelämnar detta fält ( n är lika med noll). Betydelsen och tolkningen av databytes beror på applikationen. (4-bitars data måste antingen lagras i den nedre eller övre halvan av byten, det vill säga en byte innehåller endast en adresserbar datapost.)
  6. Kontrollsumma , två hexadecimala siffror, ett beräknat värde som kan användas för att verifiera att posten inte har några fel.

Färg legend

Som ett visuellt hjälpmedel är fälten för Intel HEX-poster färgade i den här artikeln enligt följande:

  Startkod   Byteantal   Adress   Posttyp   Datakontrollsumma   _

Checksumma beräkning

En posts kontrollsummabyte är de tvås komplement av den minst signifikanta byten (LSB) av summan av alla avkodade bytevärden i posten som föregår kontrollsumman. Den beräknas genom att summera de avkodade bytevärdena och extrahera LSB för summan (dvs. datakontrollsumman), och sedan beräkna de tvås komplement av LSB (t.ex. genom att invertera dess bitar och lägga till en).

Till exempel, i fallet med posten : 03 0030 00 02337A 1E , är summan av de avkodade bytevärdena 03 + 00 + 30 + 00 + 02 + 33 + 7A = E2 , som har LSB-värdet E2 . De tvås komplement av E2 är 1E , vilket är den kontrollsummabyte som visas i slutet av posten.

Giltigheten av en post kan kontrolleras genom att beräkna dess kontrollsumma och verifiera att den beräknade kontrollsumman är lika med kontrollsumman som visas i posten; ett fel indikeras om kontrollsummorna skiljer sig åt. Eftersom postens kontrollsummabyte är de tvås komplement - och därför den additiva inversen - av datakontrollsumman, kan denna process reduceras till att summera alla avkodade bytevärden, inklusive postens kontrollsumma, och verifiera att summans LSB är noll. När den tillämpas på föregående exempel ger denna metod följande resultat: 03 + 00 + 30 + 00 + 02 + 33 + 7A + 1E = 100 , som har LSB-värdet 00 .

Textradsavslutare

Intel HEX-poster är vanligtvis åtskilda av ett eller flera ASCII-radavslutningstecken så att varje post visas ensam på en textrad. Detta förbättrar läsbarheten genom att visuellt avgränsa posterna och det ger också utfyllnad mellan poster som kan användas för att förbättra maskinanalyseffektiviteten . Radavslutningstecken är dock valfria, eftersom ' : ' används för att detektera starten av en post.

Program som skapar HEX-poster använder vanligtvis radavslutningstecken som överensstämmer med konventionerna för deras operativsystem . Till exempel använder Linux-program ett enda LF-tecken ( linjematning , hex-värde 0A ) för att avsluta rader, medan Windows-program använder en CR ( carriage return , hex-värde 0D ) följt av en LF.

Rekordtyper

Intel HEX har sex standardposttyper:

Hexkod Inspelningstyp Beskrivning Exempel
00 Data Antalet byte anger antalet databyte i posten. Exemplet har 0B (elva) databyte. 16-bitars startadressen för data (i exemplet vid adresser som börjar på 0010 ) och data ( 61 , 64 , 64 , 72 , 65 , 73 , 73 , 20 , 67 , 61 , 70 ). : 0B 0010 00 6164647265737320676170 A7
01 Slut På Fil Måste förekomma exakt en gång per fil i den sista posten i filen. Antalet byte är 00 , adressfältet är typiskt 0000 och datafältet är utelämnat. : 00 0000 01 FF
02 Utökad segmentadress Antalet byte är alltid 02 , adressfältet (vanligtvis 0000 ) ignoreras och datafältet innehåller en 16-bitars segmentbasadress. Detta multipliceras med 16 och läggs till varje efterföljande datapostadress för att bilda startadressen för datan. Detta tillåter adressering av upp till en megabyte (1048576 byte) adressutrymme. : 02 0000 02 1200 EA
03 Startsegmentadress För 80x86-processorer, anger startexekveringsadressen. Antalet byte är alltid 04 , adressfältet är 0000 och de två första databyten är CS- värdet, de två senare är IP- värdet. Utförandet bör börja på denna adress. : 04 0000 03 00003800 C1
04 Utökad linjär adress Tillåter 32 bitars adressering (upp till 4 GiB). Antalet byte är alltid 02 och adressfältet ignoreras (vanligtvis 0000 ). De två databytena (big endian) specificerar de övre 16 bitarna av den 32 bitars absoluta adressen för alla efterföljande typ 00 - poster; dessa övre adressbitar gäller till nästa 04 -post. Den absoluta adressen för en typ 00 -post bildas genom att kombinera de övre 16 adressbitarna i den senaste 04 -posten med de låga 16 adressbitarna i 00 -posten. Om en typ 00 -post inte föregås av någon typ 04 -post är dess övre 16 adressbitar som standard 0000. : 02 0000 04 0800 F2
05 Starta linjär adress Antalet byte är alltid 04 , adressfältet är 0000 . De fyra databytena representerar ett 32-bitars adressvärde (big-endian). När det gäller processorer som stöder det är denna 32-bitars adress adressen där exekveringen ska starta. : 04 0000 05 000000CD 2A

Andra posttyper har använts för varianter, inklusive 06 av Wayne och Layne, 0A , 0B , 0C , 0D och 0E av BBC / Micro : bit Educational Foundation och 81 , 82 , 83 , 84 , 85 , 86 , 87 och 88 av Digital Research .

Namngivna format

Det ursprungliga 4-bitars/8-bitars Intellec Hex Paper Tape Format och Intellec Hex Computer Punched Card Format 1973/1974 stödde endast en posttyp 00 . Detta utökades omkring 1975 [ när? ] för att även stödja posttyp 01 . Det kan inkludera en valfri rubrik som innehåller en symboltabell för symbolisk felsökning , alla tecken i en post som föregår kolon ignoreras.

Runt 1978 [ när? ] introducerade Intel de nya posttyperna 02 och 03 (för att lägga till stöd för det segmenterade adressutrymmet för de då nya 8086 / 8088 -processorerna) i deras Extended Intellec Hex Format . [ när? ]

Särskilda namn används ibland för att beteckna formaten för HEX-filer som använder specifika delmängder av posttyper. Till exempel:

  • I8HEX- filer använder endast posttyperna 00 och 01
  • I16HEX- filer använder endast posttyperna 00 till 03
  • I32HEX- filer använder endast posttyperna 00 , 01 , 04 och 05

Filexempel

Det här exemplet visar en fil som har fyra dataposter följt av en filslutspost:



 :  10  0100  00  214601360121470136007EFE09D21901  40  :  10  0110  00  2146017E17C20001FF5F160021480119  0201  0201 0201  E  49  28  965778239EDA3F01B2CA  A7  :  10  0130  00  3F0156702B5E712B722B732146013421  C7  :  00  0000  01  FF 

  Startkod   Byteantal   Adress   Posttyp   Datakontrollsumma   _

Varianter

Förutom Intels egna tillägg har flera tredje parter även definierat varianter och tillägg av Intels hex-format, inklusive Digital Research (som i det så kallade "Digital Research hex-formatet"), Zilog , Mostek , TDL , Texas Instruments , Microchip , c't , Wayne och Layne och BBC / Micro:bit Educational Foundation (med dess "Universal Hex Format"). Dessa kan ha information om programstartpunkter och registerinnehåll, en byteordning i datafälten, fyllvärden för oanvända områden, säkringsbitar och andra skillnader.

Digital Research hex-formatet för 8086-processorer stöder segmentinformation genom att lägga till posttyper för att skilja mellan kod, data, stack och extra segment.

De flesta assemblerare för CP/M-80 (och även XASM09 för Motorola 6809 ) använder inte posttyp 01h för att indikera slutet på en fil, utan använder en nolllängdsdatatyp 00h-post istället. Detta underlättar sammanlänkningen av flera hex-filer.

Texas Instruments definierar en variant där adresser är baserade på bitbredden av en processors register, inte bytes.

Microchip definierar varianterna INTHX8S (INHX8L, INHX8H), INHX8M, INHX16 (INHX16M) och INHX32 för sina PIC-mikrokontroller .

Alfred Arnolds cross-macro-assembler AS, Werner Hennig-Roleffs 8051 -emulator SIM51 och Matthias R. Pauls cross-converter BINTEL är också kända för att definiera tillägg till Intels hex-format.

Se även

Vidare läsning

externa länkar

  • binex - en omvandlare mellan Intel HEX och binär för Windows.
  • SRecord , en omvandlare mellan Intel HEX och binär för Linux ( användning ), C++ källkod.
  • kk_ihex , öppen källkod C-bibliotek för att läsa och skriva Intel HEX
  • libgis , öppen källkod C-bibliotek som konverterar Intel HEX, Motorola S-Record, Atmel Generic-filer.
  • bincopy är ett Python-paket för att manipulera Intel HEX-filer.
  • SwiftIntelHex - ett Swift-paket för att analysera Intel HEX-filer för iOS och macOS.