Acest articol este o traducere a documentului Intel „Format de esadecimala Object File“ - descrierea formatului de fișier text pe scară largă pentru stocarea datelor binare (Intel format HEX). Textul termenului comun „obiect fișier hexazecimal“, care corespunde de fapt, la un anumit firmware microcontroler (de exemplu, fișierul firmware-ul microcontroler AVR. Cu o extensie HEX), t. E. Înțeles el doar HEX-fișier.
Acest document descrie formatul fișierului hexazecimal obiect de 8-, 16- si microprocesoare Intel pe 32 de biți. Formatul hexadecimal adecvat pentru intrare PROM programator sau hardware emulatoare.
Traducător Nota: Deoarece formatul Intel HEX a fost mult timp un standard de facto, este utilizat pentru stocarea și cod de date, aproape toate, fără excepție integrate arhitecturi (încorporate) de microcontrolere și procesoare, nu numai pentru procesoarele Intel x86.
Nota traducătorului: 8-, 16- și 32-biți formate diferă unul de altul numai în structura logică, și anume, apariția în HEX-fișier înregistrează diferite tipuri (tipuri de înregistrări, vezi mai jos.) ... Formatul general codificarea HEX-fișier și înregistrările în ea, cu toate acestea, rămâne neschimbat.
Reprezentarea hexazecimală a unei binare codificate folosind caractere alfanumerice ASCII. De exemplu, 8 biți valoare binară de 00111111 corespunde hex 3F. Pentru a codifica această valoare în ASCII, utilizați 2-byte de caractere ASCII. Prima codificare octet exemplul nostru va fi egal cu ASCII caracter „3“ (în formă binară este 00110011 sau 033H), iar al doilea octet este egal cu ASCII caracterul „F“ (01000110 sau 046H). Pentru fiecare valoare de ordine octet cifre hexazecimale urmând întotdeauna astfel încât prima cifră semnificativă este. ASCII-reprezentare a codului binar necesită întotdeauna de 2 ori mai mult octeți de date decât reprezentarea binară a datelor.
Figura prezintă un exemplu al conținutului HEX-fișier.
Nota traducătorului: este posibil să nu nevoie de toate înregistrările pentru fiecare arhitectura de procesor. De exemplu, pentru microcontrolere AVR sunt utilizate de fapt, doar înregistrările de date, și la sfârșitul tipuri de înregistrări Înregistrați fișiere. CGC agent de legătură, de asemenea, adaugă un fișier pentru înregistrare AVR Start Segment de înregistrare a adresei (spre sfârșitul fișierului), dar această înregistrare nu este de obicei folosit (nu este inclus în firmware-ul de programator microcontroler).
[Formatul general de înregistrare (înregistrare generală Format)]
Fiecare intrare în HEX-fișier (linia) începe cu un marker domeniu de la începutul înregistrării MARK RECORD. conținând 03AH cod ASCII, două puncte „:“.
câmpul următor RECLEN a fiecărei înregistrări. care specifică numărul de octeți de informații utile conținute în înregistrarea (acești octeți pentru a urma RECTYP câmpului). Amintiți-vă că un octet de date este reprezentat de două caractere ASCII. Valoarea maximă pentru câmpul RECLEN este hexazecimal „FF“, t. E. Datele sarcinii utile în înregistrarea poate fi de la 0 la 255 de octeți.
Următorul câmp din fiecare RECTYP înregistrare. care indică tipul de această intrare. câmp RECTYP este utilizat pentru înregistrarea de informații în interpretare. Iată cum codificate tipuri de înregistrări:
Următorul câmp din fiecare înregistrare de lungime variabilă, câmp / DATA INFO. Se compune din zero sau mai mulți octeți (octet poate fi la 0 la 255, în conformitate cu valoarea câmpului RECLEN), în cazul în care fiecare octet este codificată ca o pereche de cifre hexazecimale. Interpretarea acestui câmp depinde de valoarea câmpului RECTYP.
În cele din urmă, fiecare înregistrare se termină cu un CHKSUM câmp. care conține reprezentarea ASCII hexazecimal a sumei de control (plus față de două cod suplimentar, suma complement față de doi) a tuturor intrărilor de octeți inclusiv din domeniul RECLEN, și terminând cu și incluzând ultimul octet de câmp / INFO DE DATE. În acest control se calculează nu din caracterul ASCII în sine, ci din punctul de vedere al fiecărei perechi de caractere ASCII HEX ca un octet. Astfel, suma tuturor perechilor din înregistrarea după conversie a fiecărei perechi în reprezentarea binară a câmpului RECLEN inclusive la domeniul CHKSUM inclusiv, este egal cu 0.
[Extended Linear înregistrare Adresa (numai pentru formatul pe 32 de biți)]
(LBA + DRLO + DRI) MOD 4G
În cazul în care DRLO încă INTRODUCEREA câmp OFFSET în înregistrarea înregistra date, DRI este egal cu indicele de octet în înregistrarea înregistrare de date.
Când Extended Linear intrare înregistrare a adresei specifică valoarea LBA, acesta poate apărea oriunde în fișierul obiect hexazecimală pe 32 de biți. Această valoare rămâne în vigoare până când un alt record extins record Adresa liniar. Valoarea implicită pentru LBA este zero până la extins de înregistrare Înregistrarea Adresa liniar.
Nota traducătorului: în intrarea HEX-files AVR Extended Linear Adresa înregistrare este utilizată.
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
Acest câmp conține două octeți 03032H, care codifică simboluri ASCII hexazecimale „02“, care este lungimea în octeți de date de informații Ulba, conținute în această înregistrare.
LOAD OFFSET
Acest câmp conține octeți 030303030H codificare simboluri hexazecimal ASCII „0000“, deoarece câmpul nu este utilizat în această înregistrare.
RECTYP
Acest câmp conține 03034H bytes de codificare hexazecimal de caractere ASCII „04“, care specifică tipul de înregistrare extins înregistrare liniar Adresă.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, LOAD OFFSET, RECTYP și Ulba.
[Extended înregistrare Segment Adresă (format 16- sau 32-biți)]
SBA + ([DRLO + DRI] MOD 64K)
În cazul în care DRLO încă INTRODUCEREA câmp OFFSET în înregistrarea de date, DRI este egal cu indicele de octet în înregistrarea de date.
Când Extins Segment înregistrare a adresei SBA record setează valoarea la care poate apărea oriunde pe obiect fișier hexazecimal de 16-biți. Această valoare rămâne în vigoare până când un alt record Segment extins Adresa Record. SBA valoare implicite la 0, până la intrarea Extended Segment Address Record.
Nota traducătorului: în HEX-fișiere este utilizat de intrare AVR Segment extins Adresa Record.
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
Acest câmp conține două octeți 03032H, care codifică simboluri ASCII hexazecimale „02“, care este lungimea în octeți de date de informații USBA, conținute în această înregistrare.
LOAD OFFSET
Acest câmp conține octeți 030303030H codificare simboluri hexazecimal ASCII „0000“, deoarece câmpul nu este utilizat în această înregistrare.
RECTYP
Acest câmp conține 03032H bytes codare hexazecimal de caractere ASCII „02“, care specifică tipul extins de înregistrare înregistrare Segment Adresă.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, LOAD OFFSET, RECTYP și USBA.
[Record de date (format 8- 16- sau 32-bit)]
Traducător Nota: Acest post - primar pentru HEX-fișier AVR firmware. În general, într-un astfel de înregistrare (rând) codificat 16 byte firmware cod de program (în câmpul RECLEN conține valoarea „10“). Ultima linie de fișier HEX poate înregistra date conține mai puțin de 16 octeți (valoarea corespunzătoare va apărea în câmpul RECLEN).
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
Acest câmp conține două cifre ASCII hexazecimale care specifică numărul de octeți de date sunt înregistrate. Valoarea maximă este „FF“ sau 04646H (care corespunde cu valoarea zecimală 255).
RECTYP
Acest câmp conține octeți 03030H care codifică caracterele ASCII hexazecimale „00“ care specifică tipul de înregistrare înregistrare de date.
DATE
Acest câmp conține perechile de cifre ASCII hex, în cazul în care fiecare pereche codifică un octet de date.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, LOAD OFFSET, RECTYP și DATE.
[Start Linear Adresa Record (format 32-bit)]
Nota traducătorului: în HEX-fișiere este utilizat de înregistrare AVR Start liniare Adresa Record.
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
câmp LRA conține 03034H, de codificare „04“ în caractere ASCII hexazecimale, care indică lungimea, în octeți, PEI conținutul registrului în această înregistrare.
LOAD OFFSET
Acest câmp conține 030303030H, codificarea „0000“ în caractere ASCII hexazecimale, deoarece acest câmp nu este utilizat în înregistrare.
RECTYP
Acest câmp conține 03035H, care codifică „05“ simboluri ASCII hexazecimale, care stabilește Start liniare înregistrare a adresei înregistrărilor de tip.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, LOAD OFFSET, RECTYP și PEI.
[Start înregistrare Segment Adresa (format 16- sau 32-biți)]
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
câmp conține LRA 03034H, care codifică „04“ simboluri ASCII hexazecimale, care indică lungimea, în octeți, conținutul regiștrilor / IP CS în această înregistrare.
LOAD OFFSET
Acest câmp conține 030303030H, codificarea „0000“ în caractere ASCII hexazecimale, deoarece acest câmp nu este utilizat în înregistrare.
RECTYP
Acest câmp conține 03033H, codifică simboluri ASCII hexazecimal „03“, care definește un start Segment de înregistrări tipul de inregistrare.
CS / IP
Acest câmp conține opt numere de caractere ASCII hexazecimal care indică conținutul registrului de 16 biți și CS registrul de IP pe 16 biți. Conținutul de registru înalt octet CS Se împerecheat simboluri 10 și 11, Jr. într-o pereche de simboluri 12 și 13. Conținutul ridicat de octet registru IP stocate în perechea de simboluri 14 și 15, Jr. pereche de caractere de 16 și 17.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, LOAD OFFSET, RECTYP și CS / IP.
[Sfârșitul înregistrării fișierului (8-, 16- sau format pe 32 de biți)]
Sfârșit Înregistrarea datelor din registrul de fișier indică sfârșitul fișierului obiect hexazecimal. Acesta este un șir de caractere care conține caracterele „: 00000001FF“.
Nota traducătorilor: În AVR HEX-fișiere, această înregistrare este, de asemenea, utilizat pentru a indica sfârșitul fișierului.
În unele domenii, există un record următorul conținut:
RECORD MARK
Acest câmp conține un caracter ASCII hexazecimal octet 03AH, de colon codificat ( „:“).
RECLEN
câmpul conține 03030H, care codifică caractere ASCII hexazecimal „00“. Din moment ce această înregistrare nu conține date INFO / DATE, atunci lungimea este zero.
LOAD OFFSET
Acest câmp conține 030303030H, codificarea „0000“ în caractere ASCII hexazecimale, deoarece acest câmp nu este utilizat în înregistrare.
RECTYP
Acest câmp conține 03031H, codifică simboluri ASCII hexazecimal „01“, care stabilește tipul de înregistrare sfârșitul înregistrării fișierului.
CHKSUM
Acest câmp conține suma de control câmpurile RECLEN, SARCINA OFFSET și RECTYP. Deoarece toate câmpului statice (conținutul întotdeauna), suma de control poate fi, de asemenea, calculat static, iar valoarea sa este 04646H, hexazecimal de codificare de caractere ASCII „FF“.
[Algoritmul de control]
sumă de control Byte pentru CHKSUM șir HEX-fișier este calculat astfel încât suma tuturor șir de octet sarcină utilă și cea mai mare de control aruncarea înapoi în mare depășire zero. În același timp, ei nu se dezvolta caractere ASCII, și numai datele pe care le reprezintă. Simplificată pseudocod algoritm de control pentru înregistrare înregistra date:
Pentru a fi absolut clar, analizăm un exemplu simplu. Iată o linie tipic de AVR microcontroler firmware HEX-fișier (pentru câmpurile de claritate, cu culori diferite, sunt marcate):
10 3800 00 5CC000008FC0000073C0000071C00000 E9
Deci, CHKSUM de control ne-ar obține dacă vom adăuga (respingere transferul) octeți de date de la câmp RECLEN (0x10), la ultimul octet al datelor de câmp [RECLEN-1] (0x00), și apoi scade de la zero, suma primită (de respingere, de asemenea, transferul) :
0xE9 = 0 - (0x10 + 0x38 + 0x00 + 0x00 + 0x5C + 0xC0 + 0x00 + 0x00 + 0x8F + 0xC0 + 0x00 + 0x00 + 0x73 + 0xC0 + 0x00 + 0x00 + 0x71 + 0xC0 + 0x00 + 0x00)
Dacă adăugați tot octeții de la RECLEN la CHKSUM inclusiv (respingerea transferului), obținem la zero: