{{위키데이터 속성 추적}}
{{Infobox file format
|name      = Intel hex
|extension = <tt>.hex</tt>,<ref name="Arnold_2020_AS">{{서적 인용|title=Macro Assembler AS - User's Manual |version=V1.42 |author-first=Alfred |author-last=Arnold |translator-first1=Alfred |translator-last1=Arnold |translator-first2=Stefan |translator-last2=Hilse |translator-first3=Stephan |translator-last3=Kanthak |translator-first4=Oliver |translator-last4=Sellke |translator-first5=Vittorio |translator-last5=De Tomasi |date=2020 |orig-year=1996, 1989 |chapter=6.3. P2HEX |chapter-url=http://john.ccac.rwth-aachen.de:8000/as/as_EN.html#sect_6_3_ |url=http://john.ccac.rwth-aachen.de:8000/as/as_EN.html |access-date=2020-02-28 |url-status=live |archive-url=https://web.archive.org/web/20200228144943/http://john.ccac.rwth-aachen.de:8000/as/as_EN.html |archive-date=2020-02-28 |quote=[…] For the [[PIC microcontroller]]s, the switch -m <0..3> allows to generate the three different variants of the Intel Hex format. Format 0 is INHX8M which contains all bytes in a Lo-Hi-Order. Addresses become double as large because the PICs have a word-oriented address space that increments addresses only by one per word. […] With Format 1 (INHX16M), bytes are stored in their natural order. This is the format [[Microchip Technology|Microchip]] uses for its own programming devices. Format 2 (INHX8L) resp. 3 (INHX8H) split words into their lower resp. upper bytes. […]  Unfortunately, one finds different statements about the last line of an Intel-Hex file in literature. Therefore, P2HEX knows three different variants that may be selected […] :00000001FF […] :00000001 […] :0000000000 […] By default, variant 0 is used which seems to be the most common one. […] If the target file name does not have an extension, an extension of HEX is supposed. […]}}</ref> <tt>.h86<!-- x86 version only --></tt>,<ref name="DRI_1981_CPM86-SG">{{서적 인용|title=CP/M-86 Operating System - System Guide |chapter=3.1. Intel 8086 Hex File Format |date=June 1981 |edition=2nd printing, 1st |publisher=[[Digital Research]] |location=Pacific Grove, California, USA |pages=15–16 |url=http://www.bitsavers.org/pdf/digitalResearch/cpm-86/CPM-86_System_Guide_Jun81.pdf |access-date=2020-02-28 |url-status=live |archive-url=https://web.archive.org/web/20200228220027/http://www.bitsavers.org/pdf/digitalResearch/cpm-86/CPM-86_System_Guide_Jun81.pdf |archive-date=2020-02-28}} (17 pages)</ref><ref name="DRI_1983_CPM86-PG">{{서적 인용|title=CP/M-86 - Operating System - Programmer's Guide |chapter=Appendix C. ASM-86 Hexadecimal Output Format |date=January 1983 |orig-year=1981 |edition=3 |publisher=[[Digital Research]] |location=Pacific Grove, California, USA |pages=97–100 |url=http://www.bitsavers.org/pdf/digitalResearch/cpm-86/CPM-86_Programmers_Guide_Jan83.pdf |access-date=2020-02-27 |url-status=live |archive-url=https://web.archive.org/web/20200227225328/http://www.bitsavers.org/pdf/digitalResearch/cpm-86/CPM-86_Programmers_Guide_Jan83.pdf |archive-date=2020-02-27 |quote=[…] The [[Intel]] format is identical to the format defined by Intel for the [[Intel 8086|8086]]. The [[Digital Research]] format is nearly identical to the Intel format, but adds segment information to hexadecimal records. Output of either format can be input to [[GENCMD (CP/M command)|GENCMD]], but the Digital Research format automatically provides segment identification. A segment is the smallest unit of a program that can be relocated. […] It is in the definition of record types 00 and 02 that Digital Research's hexadecimal format differs from Intel's. Intel defines one value each for the data record type and the segment address type. Digital Research identifies each record with the segment that contains it. […] 00H for data belonging to all 8086 segments […] 81H for data belonging to the CODE segment […] 82H for data belonging to the DATA segment […] 83H for data belonging to the STACK segment […] 84H for data belonging to the EXTRA segment […] 02H for all segment address records […] 85H for a CODE absolute segment address […] 86H for a DATA segment address […] 87H for a STACK segment address […] 88H for an EXTRA segment address […]}} [https://web.archive.org/web/20200227132338/https://www.z80cpu.eu/mirrors/oldcomputers.dyndns.org/public/pub/manuals/cpm86pg.pdf] (1+viii+122+2 pages)</ref> <tt>.hxl<!-- IDA, split 8-bit format only --></tt>,<ref name="IDA_2006_Hexforms">{{웹 인용 |title=The Interactive Disassembler - Hexadecimal fileformats |date=2006 |publisher=[[Hex-Rays]] |url=https://hwiegman.home.xs4all.nl/fileformats/hex/hexforms.htm |access-date=2020-03-01 |url-status=live |archive-url=https://web.archive.org/web/20200301141412/https://hwiegman.home.xs4all.nl/fileformats/hex/hexforms.htm |archive-date=2020-03-01 }} [http://www.idea2ic.com/File_Formats/Hexadecimal%20file%20formats.pdf] {{웨이백|url=http://www.idea2ic.com/File_Formats/Hexadecimal%20file%20formats.pdf |date=20211116195244 }}</ref> <tt>.hxh<!-- IDA, split 8-bit format only --></tt>,<ref name="IDA_2006_Hexforms"/> <tt>.obl<!-- IDA, split 8-bit format only --></tt>,<ref name="IDA_2006_Hexforms"/> <tt>.obh<!-- IDA, split 8-bit format only --></tt>,<ref name="IDA_2006_Hexforms"/> <tt>.mcs</tt>,<ref name="Xilinx_2010_MCS">{{웹 인용|title=AR#476 PROMGen - Description of PROM/EEPROM file formats: MCS, EXO, HEX, and others |at=Intel MCS-86 Hexadecimal Object - File Format Code 88 |date=2010-03-08 |publisher=[[Xilinx]] |url=https://www.xilinx.com/support/answers/476.html |access-date=2020-03-03 |url-status=live |archive-url=https://web.archive.org/web/20200303085851/https://www.xilinx.com/support/answers/476.html |archive-date=2020-03-03}}</ref> <tt>.ihex</tt>, <tt>.ihe<!-- .ihex stripped down to 3 characters, also used for other purposes --></tt>, <tt>.ihx</tt><!-- also used for other purposes -->, <tt>.a43<!-- TI MPS430, not sure this is pure Intel hex --></tt>
}}
'''인텔 HEX'''(Intel HEX)는 [[미국정보교환표준부호|ASCII]] 텍스트 형식으로 이진 정보를 전달하는 [[파일 형식]]이다. 이것은 [[마이크로컨트롤러]], [[EPROM]] 그리고 다른 [[설계 가능 논리 소자|논리 장치]]의 프로그래밍을 위해 흔히 사용된다. 대표적으로 [[컴파일러]]나 [[어셈블리어#어셈블러|어셈블러]]는 [[컴퓨터 프로그램]]의 [[소스 코드]]를 (예를 들어 [[C (프로그래밍 언어)|C]]나 [[어셈블리어]]) [[기계어]]로 변환하고, 이를 HEX 파일로 출력한다. 그리고 나서 이 HEX 파일은 [[소자 프로그래머]]가 읽어서 [[고정 기억 장치|ROM]]를 굽거나, 메모리에 올리고 실행하기 위해 목적 시스템으로 전송된다.<ref>Intel: "[http://microsym.com/editor/assets/intelhex.pdf Hexadecimal Object File Format Specification] {{웨이백|url=http://microsym.com/editor/assets/intelhex.pdf |date=20160607224738 }}", Revision A, January 6, 1988</ref>

==형식==
인텔 HEX는 [[새줄 문자|LF]]나 [[캐리지 리턴|CR]]로 구분된 여러줄의 [[미국정보교환표준부호|ASCII]] 텍스트로 구성된다. 각 줄은 다수의 바이너리 숫자를 [[:en:Binary-to-text encoding|부호화]]한 [[십육진법|16진수]] 문자를 담고 있다. 이 바이너리 숫자가 줄에서의 위치, 종류, 줄의 길이에 따라 [[메모리 주소]]나 기타의 값인 데이터를 나타낼 것이다. 각 텍스트 줄을 레코드(''record'')라고 한다.

===레코드 구조===
하나의 [[:en:Record (computer science)|레코드]](텍스트 한줄)는 왼쪽에서 오른쪽으로 순서대로 여섯가지 [[Field (computer science)|필드]](부분)로 나타난다.
# '''시작코드(Start code)''', 한 문자, ASCII 문자 ':'(colon).
# '''바이트 개수(Byte count)''', 16진수 문자 두 자리, 데이터 필드에 있는 바이트(16진수 두 문자의 쌍)의 수를 가리킨다. 최대 바이트 개수는 255 (0xFF)다. 16 (0x10) 과 32 (0x20)가 흔히 쓰인다.
# '''주소(Address)''', 16진수 문자 네 자리, 데이터의 16비트 시작 주소의 옵셋 값을 표현한다. 데이터의 물리 주소는 앞서 지정된 기준 주소에 이 옵셋을 더해서 구한다. 이런 식으로 16비트 주소의 한계인 64 킬로바이트를 넘는 주소를 지정 한다. 기준 주소의 기본값은 0이고, 여러 종류의 레코드로 값을 바꿀 수 있다. 기준 주소와 주소는 항상 [[엔디언|빅 엔디언]]으로 표현된다.
# '''레코드 종류(Record type)''' (아래 [[인텔 HEX#레코드 종류|레코드 종류]] 참조), 16진수 문자 두 자리, ''00''에서 ''05'', 데이터 필드의 종류를 정의한다.
# '''데이터(Data)''', 2''n'' 개의 16진수 문자로 표현된 ''n'' 바이트의 데이터 열이다. 어떤 레코드는 이 필드가 빠져 있다(''n''이 0). 데이터 바이트들의 의미나 해석은 응용프로그래밍에 달렸다.
# '''체크섬([[Checksum]])''', 16진수 문자 두 자리, 레코드에 오류가 없음을 입증하는데 이용될 수 있는 계산된 값이다.

====색 일러두기====

이 문서에서 Intel HEX 레코드의 필드들은 눈에 잘 띄도록 다음처럼 색칠된다.

{{legend inline|#FFFFCC|시작코드}}
{{legend inline|#CCFFCC|바이트 개수}}
{{legend inline|#CCCCFF|주소}}
{{legend inline|#FFCCCC|레코드 종류}}
{{legend inline|#CCFFFF|데이터}}
{{legend inline|#CCCCCC|체크섬}}

====체크섬 계산====
레코드의 [[체크섬]] 바이트는 레코드에서 체크섬에 앞서 있는 모든 복호화된 바이트 합의 [[최하위 비트|최하위 바이트]](LSB)의 [[2의 보수]]이다. 이것은 복호화된 값(파일에 있는 16진수 문자가 아니라 그것을 두 개씩 짝지어 바이트로 해석한 값)들을 모두 더하고, 더한 값의 LSB(256으로 나눌 때 나머지)를 뽑아서 그것의 2의 보수(모든 비트를 [[1의 보수|뒤집고]] 1를 더한다)를 구한 것이다.

예를 들어, {{인텔 HEX|03|0030|00|02337A|1E}} 이런 레코드에서  길이부터 체크썸 전까지를 합하면 {{인텔 HEX|03||||}} + {{인텔 HEX||00|||}} + {{인텔 HEX||30|||}} + {{인텔 HEX|||00||}} + {{인텔 HEX||||02|}} + {{인텔 HEX||||33|}} + {{인텔 HEX||||7A|}} = <code>E2</code>이다. <code>E2</code>의 [[2의 보수]]는 {{인텔 HEX|||||1E}}이다.

레코드의 유효함은 체크섬을 계산하고, 계산한 체크섬과 레코드에 있는 체크섬이 같다는 것을 확인해서 검사될 수 있다; 체크섬이 다르다는 것은 오류가 있음을 가리키는 것이다. 레코드의 체크섬이 데이터 체크섬의 음수라서 체크섬을 포함하는 전체 복호화된 바이트를 더하면 LSB는 0이 된다.

===줄 종료문자===
인텔 HEX 레코드는 각 레코드가 한 줄의 텍스트에 날 수 있도록 하나 이상의 ASCII 줄 끝 문자로 구분된다. 이것은 시각적인 가독성을 높여주고, 레코드 사이에 끼워져 있어 기계의 [[구문 분석]] 효율을 향상시키는데 이용될 수 있다.

HEX 레코드를 만들어내는 프로그램은 전형적으로 사용하는 [[운영 체제]]의 관례에 따른 줄 끝 문자를 사용한다. 예를 들어, 리눅스 프로그램은 하나의 LF([[새줄 문자|줄 바꿈]], 16진수 값 <code>0A</code>) 문자만 사용하고, 윈도우즈 프로그램은 CR ([[캐리지 리턴|CR]], 16진수 값 <code>0D</code>)과 LF를 이어서 쓴다.

===레코드 종류===
현재 여섯가지 종류가 있다.:

{| class="wikitable"
|-
! Hex code
! Record type
! Description
! Example
|- valign="top"
| align="center" | {{인텔 HEX|||00||}}
| 데이터
| 16비트 시작 주소와 데이터를 가진다. 데이터의 바이트 수가 주어진다. 오른쪽 예제는 {{인텔 HEX|0B||||}} 11개의 데이터 바이트를 가진다. ({{인텔 HEX||||61|}}, {{인텔 HEX||||64|}}, {{인텔 HEX||||64|}}, {{인텔 HEX||||72|}}, {{인텔 HEX||||65|}}, {{인텔 HEX||||73|}}, {{인텔 HEX||||73|}}, {{인텔 HEX||||20|}}, {{인텔 HEX||||67|}}, {{인텔 HEX||||61|}}, {{인텔 HEX||||70|}}) 이들 데이터가 {{인텔 HEX||0010|||}} 주소에서부터 연속으로 놓인다.
| {{인텔 HEX|0B|0010|00|6164647265737320676170|A7}}
|- valign="top"
| align="center" | {{인텔 HEX|||01||}}
| 파일의 끝
| 파일의 마지막 줄에 꼭 있어야 한다. 데이터 필드는 없다. 따라서 바이트 개수는 {{인텔 HEX|00||||}}이고, 주소 필드도 보통 {{인텔 HEX||0000|||}}이다.
| {{인텔 HEX|00|0000|01||FF}}
|- valign="top"
| align="center" | {{인텔 HEX|||02||}}
| 확장된&nbsp;세그먼트&nbsp;주소
| 이 데이터 필드는 16비트 세그먼트 기준 주소다. 따라서 바이트 개수는 {{인텔 HEX|02||||}}다. 80x86 리얼 모드 주소와의 호환을 위한 것이다. 주소 필드는 무시된다. 보통 {{인텔 HEX||0000|||}}이다. 세그먼트 주소 {{인텔 HEX|||02||}} 레코드의 값이 16 곱해져서 이어지는 데이터 레코더의 주소에 더해져야 데이터의 물리 시작 주소가 된다. 이것은 1M까지의 주소 공간을 지원한다.
| {{인텔 HEX|02|0000|02|1200|EA}}
|- valign="top"
| align="center" | {{인텔 HEX|||03||}}
| 시작 세그먼트 주소
| 80x86 프로세서에서, CS:IP 레지스터의 초기값을 주어진다. 주소 필드는 보통 {{인텔 HEX||0000|||}}이고, 바이트 개수는 {{인텔 HEX|04||||}}다. 첫 두 바이트가 [[Code segment|CS]] 값이고, 다음 둘이 [[instruction pointer|IP]] 값이다.
| {{인텔 HEX|04|0000|03|00003800|C1}}
|- valign="top"
| align="center" | {{인텔 HEX|||04||}}
| 확장된 선형 주소
| 4기가바이트까지 가능한 32비트 주소체계를 지원한다. 주소 필드는 보통 {{인텔 HEX||0000|||}}으로 무시되고 바이트 개수는 항상 {{인텔 HEX|02||||}}다. 빅 엔디안의 두 데이터 바이트가 이어지는 {{인텔 HEX|||00||}} 레코드의 절대 주소의 상위 16비트가이다. {{인텔 HEX|||04||}} 종류의 레코드가 없는 {{인텔 HEX|||00||}} 레코드의 주소 상위 16비트는 기본값 0이다. {{인텔 HEX|||00||}} 종류의 레코드의 절대 주소는 최근의 {{인텔 HEX|||04||}} 레코드 값이 상위 16비트가 되고, {{인텔 HEX|||00||}} 레코드의 주소 값이 하위 16비트가 된다.
| {{인텔 HEX|02|0000|04|FFFF|FC}}
|-
| align="center" | {{인텔 HEX|||05||}}
| 시작 선형 주소
| 주소 필드는 {{인텔 HEX||0000|||}}으로 사용하지 않고, 바이트 개수는 {{인텔 HEX|04||||}}다. 4바이트 데이터는 80386과 더 높은 CPU의 EIP 레지스터에 기록할 32비트 값을 나타낸다.
| {{인텔 HEX|04|0000|05|000000CD|2A}}
|}

===다른 이름===
때때로 레코드 종류의 일부만 채용한 HEX 파일 형식을 지칭하기 위해 특별한 이름이 사용된다. 예를 들어:
* '''I8HEX''' 파일은 {{인텔 HEX|||00||}}과 {{인텔 HEX|||01||}} 레코드만 사용한다. (16비트 주소지정)
* '''I16HEX''' 파일은 {{인텔 HEX|||00||}}에서 {{인텔 HEX|||03||}}까지의 레코드만 사용한다. (20비트 주소지정)
* '''I32HEX''' 파일은 {{인텔 HEX|||00||}}, {{인텔 HEX|||01||}}, {{인텔 HEX|||04||}} 그리고 {{인텔 HEX|||05||}} 레코드만 사용한다. (32비트 주소지정)

==파일 예제==
이 예제는 4개의 데이터 레코드와 뒤따르는 끝 레코드를 보여준다.
 {{인텔 HEX|10|0100|00|214601360121470136007EFE09D21901|40}}
 {{인텔 HEX|10|0110|00|2146017E17C20001FF5F160021480119|28}}
 {{인텔 HEX|10|0120|00|194E79234623965778239EDA3F01B2CA|A7}}
 {{인텔 HEX|10|0130|00|3F0156702B5E712B722B732146013421|C7}}
 {{인텔 HEX|00|0000|01||FF}}

== 같이 보기 ==
;글
* [[:en:Binary-to-text encoding]], a survey and comparison of encoding algorithms
* [[:en:SREC (file format)|SREC]], hex file format by Motorola
* [[:en:Tektronix extended HEX|TekHex]], hex file format by Tektronix
;기타
* [[틀:인텔 HEX]]

== 각주 ==
{{각주}}

== 외부 링크 ==
;문서
* [http://www.piclist.com/techref/fileext/hex/intel.htm Intel HEX format description] {{언어링크|en}}
* [http://www.sbprojects.com/knowledge/fileformats/intelhex.php Intel HEX reference with examples] {{웨이백|url=http://www.sbprojects.com/knowledge/fileformats/intelhex.php |date=20200301224049 }} {{언어링크|en}}

;소프트웨어
* [http://www.nlsw.nl/software/ binex] {{언어링크|en}}, a converter between Intel HEX and binary
* [http://github.com/vsergeev/libGIS libgis] {{언어링크|en}}, open source library that converts Intel HEX and other formats
* [http://srecord.sourceforge.net/ SRecord] {{언어링크|en}}, a converter between Intel HEX and binary ([https://web.archive.org/web/20160304082402/https://delog.wordpress.com/2011/05/26/convert-a-bin-file-to-hex/ usage])
* [https://pypi.python.org/pypi/bincopy bincopy] {{언어링크|en}} is a python package for manipulating Intel HEX format files.

{{전거 통제}}

[[분류:임베디드 시스템]]
[[분류:파일 포맷]]