Intel Hex File Format 에 관하여 MCU KOREA Co.,Ltd www.mcukorea.co.kr 본문서의모든내용은대한민국저작권법에의하여보호되며모든권리는 MCUKOREA Co.,Ltd 에 있으며매뉴얼의어떤내용도복사나기타문서제조도구에의하여복제되는것을금지합니다.
Intelhex format 에관하여 Intel Hex파일포멧은 Hex파일형태로가장많이사용하는것으로서, 만들어지게된목적은크게두가지로첫째, Binary 데이터를텍스트로변환하여모니터화면에 Display( 예전에 Punch Card나 Paper Tape사용을위한 ) 가능하게한것이고, 둘째는초기시리얼통신방식인 RS232, RS485 통신의 Error Recovery를위한것이었다. 실제 Binary로구성된파일의데이터를모니터에디스플레이했을경우그 Binary의 hex값은화면으로확인할수없다. 디스플레이된다하더라도다른숫자나문자가보일것이다. 왜냐하면화면에는그 Binary에해당하는 ASCII값이모니터에디스플레이되기때문이다. 일예로만약 Binary 데이터가 0x32를디스플레이할경우우리는모니터에서 0x32를확인할수없을것이며대신에 a 문자가확인될것이다. 그러므로 Binary 데이터를텍스트의 ASCII코드값으로변환하여기타다른텍스트정보 ( 어드레스, 체크섬등 ) 와같이저장하는형태를만듦으로써우리가직접확인해볼수있도록한것이다. 그래서우리는데이터의수정및변환등이 Editor로서가능하게된다. 이러한형태중하나가바로 Intelhex File Format이다. 그럼이제 Intelhex file format을살펴보도록한다. 만약예제로볼만한파일이있다면 Editor로열어서참조하기바란다. 다음과같은형식으로저장되어있을것이다. :MMNNNNOOPPPPP.QQ :RRSSSSTTUUUUU..VV :. 위에서보듯이보통은 5가지로구분될수있다. 갑부분은각기다른정보를가지고있는데다음과같다. [ : ] : Record Mark라칭하고이는라인의시작을알리는마크이다. [ MM ] : Data Length라고말하며현제라인에기록할데이터의길이 [ NNNN ] : OFFSET이라고말하면현제라인에기록된첫데이터가위치할어드레스 [ OO ] : Record Type이라고말하며현제라인의속성에관한정보를지닌다. [ PPPPP. ] : MM에서정의한길이만큼의실제데이터가위치한다. [ QQ ] : Check sum으로서 QQ앞의모든수를더한값의아래서두번째자리까지의숫자를 2의보수취한값이다. [ CR/LF ] Carrige return/linefeed 우선하나의예를들어설명을하면이해가쉬우리라생각되어예를살펴보기로한다. :0300000002502586 :00000001FF 예제를기능별로구분해보면각각
: 03 0000 00 025025 86 : 00 0000 01 FF 가된다. 위의라인부터살펴보면 03은동라인의실제데이터수로서 3바이트의데이터를가지고있음을나타내고있고그데이터의어드레스는 0000번지이며다음 00은현제기록이데이터의기록을의미하는속성을나타내며 025025는 3바이트의데이터가된다. 마지막으로 86은 Check Sum으로 86인데 03+00+00+00+02+50+25= 0x7A의값이나오고 0x7A의 2의보수를취하면 0x86이나오게된다. 다시말하면 0x100-0x7A=0x86이된다. 만약합계가 0x68라면아래서두번째까지의수 0x68에대한 2의보수를취한값은 0x100-0x68=0x98에의해 0x98이된다. 다음라인을살펴보면 00데이터수로현제라인의데이터는 0이며어드레스또한 0, 기록의타입은 01로현제파일의끝을나타내는속성을가진다. 그리고앞에서데이터의수가 0이었음으로데이터는없다. 마지막으로 0xFF로서모든합이 0x1이고 2의보수는 100-0x1=0xFF가됨으로써 Check sum이표시되어있다. 이와같이대부분의 hexfile은데이터라인데이터라인 --- --- 00000001FF ( 파일의끝을나타내는속성을갖는기록은 Fix 되어있다 ) 형태로구성된다. 이제전체적인구성이이해가되었을것이지만몇가지의문사항이생길것이다. Record Type의종류가궁금할것이고어드레스가 2바이트인데어드레스가 4바이트인경우는어떻게할것인가하고말이다. 그럼이제부터궁금사항에대해풀어가보도록하자. Record Type : 00 Data Record 01 End of File Record 02 Extended Segment Address Record 16 or 32 비트 CPU 03 Start Segment Address Record 16 or 32 비트 CPU 04 Extended Linear Address Record 32비트 CPU Only 05 Start Linear Address Record - 32비트 CPU Only 우리는흔히 Record Type이 00과 01인것을많이보아왔을것이다. 앞에서설명한것도이두가지의예인데다시한번설명하면 00과 01인 Record Type은다음과같다.! Data Record :MMNNNN00PPPPP.QQ MM은데이터의길이, NNNN은데이터가들어가어드레스, 00은데이터레코드타입, PPPP 은 MM에서정의한길이 ( 단위 : 바이트 ) 만큼의데이터, QQ는 Checksum
! End of File Record :00000001FF 위의 Record Type 은 End of File 로서 Check sum 이 FF 이다. 파일의끝을나타낸다. 그러나우리가 Record Type을 00과 01만을사용한다면 Data Record에 2바이트의어드레스만존재하므로 2바이트이상의어드레싱능력이없다. 따라서 64 Kbyte 이상의데이터저장할수있는 2바이트이상의어드레싱이가능한 02, 03, 04, 05 같은확장속성을갖는 Record Type을만들게되었다. 이제확장속성을갖는기록에대해알아본다.! Extended Segment Address Record : 16 or 32 비트 CPU :02000002GGGGMM 대부분은 20bit address급이상인경우이 Record Type을사용함 GGGG는 SBA(Segment Base Address), MM은 Checksum이다. 여기서 SBA인 GGGG는어드레스의 4 19까지의값을갖는다. 0xGGGG0와다음에따르는 Data Record의 OFFSET 값을더한값이지시하는어드레스가된다. 여기서더한 Carry발생은무시된다. [ 실제어드레스 = 0xGGGG0+ Data Record Type의 OFFSET 2바이트 ]! Extended Linear Address Record : 32비트 CPU Only :02000004GGGGMM GGGG는 LBA(Linear Base Address), MM은 Checksum이다. 32bit 어드레싱을위한것이다. 여기서 GGGG는 Extended Linear Address Record이후의다른확장 Record가있기전에 Data Record의상위어드레스비트 16 31까지의값을갖는다. 0xGGGG0000와다음에따르는 Data Record의 OFFSET값을더한값이지시하는어드레스가된다. [ 실제어드레스 = 0xGGGG0000+ Data Record Type의 OFFSET 2바이트 ]! Start Segment Address Record : 16 or 32 비트 CPU :04000003GGGGGGGGMM GGGGGGGG은 8086/80186의 CS/IP레지스터값, MM은 Checksum이다. 이 Record Type 은 Real Mode 20bit 어드레싱인경우만사용하는것으로서다운된오브젝트의프로그램 Start Address를지정하기위해사용된다.! Start Linear Address Record : 32비트 CPU Only :04000005GGGGGGGGMM GGGGGGGG은 80386의 EIP값, MM은 Checksum이다. 이 Record Type은 80386의리니어 32비트어드레싱인경우만사용하는것으로서다운된오브젝트의프로그램 Start Address를지정하기위해사용된다.
위에서각 Record Type에따라알아보았듯이, 이중 Intelhex File Format으로잘사용하는 Record Type을눈치챘을것으로생각된다. 우선 64K(2바이트어드레싱 ) 이내의데이터는 00, 01의 Record Type을사용하고, 2바이트어드레싱이상은 02, 04의 Record Type 중하나를더추가하여사용한다. 64K(16비트어드레싱 ) 이상의 1M(20비트어드레싱 ) 이하의경우는보통 02, 00, 01 Record Type을, 1M이상인경우 04, 00, 01의 Record Type을사용하게된다. 03, 05 Record Type은 8086, 80386을위한것으로위에서의설명으로충분하리라본다. 그럼이제 64K이내 64K-1M, 1M이상의예제를살펴보도록한다. i) 64K(2바이트어드레싱 ) 이내 위의경우 Data Record와 End of File Record 만으로구성되어있으며 2010번지부터 50 216021, 2018번지부터 FD20DE20의 8바이트의데이터를가지는 Hex File이다. 마지막으로 00000001FF는이 Hex File의끝을나타내주는 End of File Record이다. ii) 64K-1M(20비트어드레싱 ) :02000002F0000C ---- Extended Segment Address Record 위의경우는 Extended Segment Address Record와 Data Record, End of File Record로구성된 64K-1M의데이터를저장하는 Intel Hex File이다. 각데이터의번지는 Extended Segment Address Record에서정의된 0xF0000와 2010를합한 0xF2010과 0xF2018번지가되며그번지데이터는각각 50216021, FD20DE20가된다. iii) 1M이상 (20비트어드레싱이상 ) :020000040014E8 ---- Extended Linear Address Record 위의경우는 Extended Linear Address Record와 Data Record, End of File Record로구성된 1M이상의데이터를저장하는 Intel Hex File이다. 각데이터의번지는 Extended Linear Address Record에서정의된 0x00140000와 2010를합한 0x00142010과 0x0014 2018번지가되며그번지데이터는각각 50216021, FD20DE20가된다. 지금까지 Intel Hex File Format에관하여알아보았다. 조금이나마도움되었으면한다.