인텔 HEX

archive-date=2020-03-03 `.ihex`, `.ihe`, `.ihx`, `.a43` **인텔 HEX**(Intel HEX)는 ASCII 텍스트 형식으로 이진 정보를 전달하는 파일 형식이다. 이것은 마이크로컨트롤러, EPROM 그리고 다른 논리 장치의 프로그래밍을 위해 흔히 사용된다. 대표적으로 컴파일러나 어셈블러는 컴퓨터 프로그램의 소스 코드를 (예를 들어 C나 어셈블리어) 기계어로 변환하고, 이를 HEX 파일로 출력한다. 그리고 나서 이 HEX 파일은 소자 프로그래머가 읽어서 ROM를 굽거나, 메모리에 올리고 실행하기 위해 목적 시스템으로 전송된다.Intel: "Hexadecimal Object File Format Specification url=https://web.archive.org/web/20160607224738/http://microsym.com/editor/assets/intelhex.pdf", Revision A, January 6, 1988
# 형식
인텔 HEX는 LF나 CR로 구분된 여러줄의 ASCII 텍스트로 구성된다. 각 줄은 다수의 바이너리 숫자를 부호화한 16진수 문자를 담고 있다. 이 바이너리 숫자가 줄에서의 위치, 종류, 줄의 길이에 따라 메모리 주소나 기타의 값인 데이터를 나타낼 것이다. 각 텍스트 줄을 레코드(*record*)라고 한다.
## 레코드 구조
하나의 레코드(텍스트 한줄)는 왼쪽에서 오른쪽으로 순서대로 여섯가지 필드(부분)로 나타난다. # **시작코드(Start code)**, 한 문자, ASCII 문자 ':'(colon). # **바이트 개수(Byte count)**, 16진수 문자 두 자리, 데이터 필드에 있는 바이트(16진수 두 문자의 쌍)의 수를 가리킨다. 최대 바이트 개수는 255 (0xFF)다. 16 (0x10) 과 32 (0x20)가 흔히 쓰인다. # **주소(Address)**, 16진수 문자 네 자리, 데이터의 16비트 시작 주소의 옵셋 값을 표현한다. 데이터의 물리 주소는 앞서 지정된 기준 주소에 이 옵셋을 더해서 구한다. 이런 식으로 16비트 주소의 한계인 64 킬로바이트를 넘는 주소를 지정 한다. 기준 주소의 기본값은 0이고, 여러 종류의 레코드로 값을 바꿀 수 있다. 기준 주소와 주소는 항상 빅 엔디언으로 표현된다. # **레코드 종류(Record type)** (아래 레코드 종류 참조), 16진수 문자 두 자리, *00*에서 *05*, 데이터 필드의 종류를 정의한다. # **데이터(Data)**, 2*n* 개의 16진수 문자로 표현된 *n* 바이트의 데이터 열이다. 어떤 레코드는 이 필드가 빠져 있다(*n*이 0). 데이터 바이트들의 의미나 해석은 응용프로그래밍에 달렸다. # **체크섬(Checksum)**, 16진수 문자 두 자리, 레코드에 오류가 없음을 입증하는데 이용될 수 있는 계산된 값이다.
### 색 일러두기
이 문서에서 Intel HEX 레코드의 필드들은 눈에 잘 띄도록 다음처럼 색칠된다. 시작코드 바이트 개수 주소 레코드 종류 데이터 체크섬
### 체크섬 계산
레코드의 체크섬 바이트는 레코드에서 체크섬에 앞서 있는 모든 복호화된 바이트 합의 최하위 바이트(LSB)의 2의 보수이다. 이것은 복호화된 값(파일에 있는 16진수 문자가 아니라 그것을 두 개씩 짝지어 바이트로 해석한 값)들을 모두 더하고, 더한 값의 LSB(256으로 나눌 때 나머지)를 뽑아서 그것의 2의 보수(모든 비트를 뒤집고 1를 더한다)를 구한 것이다. 예를 들어, 1E 이런 레코드에서 길이부터 체크썸 전까지를 합하면 + + + + + + = `E2`이다. `E2`의 2의 보수는 1E이다. 레코드의 유효함은 체크섬을 계산하고, 계산한 체크섬과 레코드에 있는 체크섬이 같다는 것을 확인해서 검사될 수 있다; 체크섬이 다르다는 것은 오류가 있음을 가리키는 것이다. 레코드의 체크섬이 데이터 체크섬의 음수라서 체크섬을 포함하는 전체 복호화된 바이트를 더하면 LSB는 0이 된다.
## 줄 종료문자
인텔 HEX 레코드는 각 레코드가 한 줄의 텍스트에 날 수 있도록 하나 이상의 ASCII 줄 끝 문자로 구분된다. 이것은 시각적인 가독성을 높여주고, 레코드 사이에 끼워져 있어 기계의 구문 분석 효율을 향상시키는데 이용될 수 있다. HEX 레코드를 만들어내는 프로그램은 전형적으로 사용하는 운영 체제의 관례에 따른 줄 끝 문자를 사용한다. 예를 들어, 리눅스 프로그램은 하나의 LF(줄 바꿈, 16진수 값 `0A`) 문자만 사용하고, 윈도우즈 프로그램은 CR (CR, 16진수 값 `0D`)과 LF를 이어서 쓴다.
## 레코드 종류
현재 여섯가지 종류가 있다.: {| class="wikitable" |- ! Hex code ! Record type ! Description ! Example |- valign="top" | align="center" | | 데이터 | 16비트 시작 주소와 데이터를 가진다. 데이터의 바이트 수가 주어진다. 오른쪽 예제는 11개의 데이터 바이트를 가진다. (, , , , , , , , , , ) 이들 데이터가 주소에서부터 연속으로 놓인다. | A7 |- valign="top" | align="center" | | 파일의 끝 | 파일의 마지막 줄에 꼭 있어야 한다. 데이터 필드는 없다. 따라서 바이트 개수는 이고, 주소 필드도 보통 이다. | FF |- valign="top" | align="center" | | 확장된 세그먼트 주소 | 이 데이터 필드는 16비트 세그먼트 기준 주소다. 따라서 바이트 개수는 다. 80x86 리얼 모드 주소와의 호환을 위한 것이다. 주소 필드는 무시된다. 보통 이다. 세그먼트 주소 레코드의 값이 16 곱해져서 이어지는 데이터 레코더의 주소에 더해져야 데이터의 물리 시작 주소가 된다. 이것은 1M까지의 주소 공간을 지원한다. | EA |- valign="top" | align="center" | | 시작 세그먼트 주소 | 80x86 프로세서에서, CS:IP 레지스터의 초기값을 주어진다. 주소 필드는 보통 이고, 바이트 개수는 다. 첫 두 바이트가 CS 값이고, 다음 둘이 IP 값이다. | C1 |- valign="top" | align="center" | | 확장된 선형 주소 | 4기가바이트까지 가능한 32비트 주소체계를 지원한다. 주소 필드는 보통 으로 무시되고 바이트 개수는 항상 다. 빅 엔디안의 두 데이터 바이트가 이어지는 레코드의 절대 주소의 상위 16비트가이다. 종류의 레코드가 없는 레코드의 주소 상위 16비트는 기본값 0이다. 종류의 레코드의 절대 주소는 최근의 레코드 값이 상위 16비트가 되고, 레코드의 주소 값이 하위 16비트가 된다. | FC |- | align="center" | | 시작 선형 주소 | 주소 필드는 으로 사용하지 않고, 바이트 개수는 다. 4바이트 데이터는 80386과 더 높은 CPU의 EIP 레지스터에 기록할 32비트 값을 나타낸다. | 2A |}
## 다른 이름
때때로 레코드 종류의 일부만 채용한 HEX 파일 형식을 지칭하기 위해 특별한 이름이 사용된다. 예를 들어: * **I8HEX** 파일은 과 레코드만 사용한다. (16비트 주소지정) * **I16HEX** 파일은 에서 까지의 레코드만 사용한다. (20비트 주소지정) * **I32HEX** 파일은 , , 그리고 레코드만 사용한다. (32비트 주소지정)
# 파일 예제
이 예제는 4개의 데이터 레코드와 뒤따르는 끝 레코드를 보여준다. 40 28 A7 C7 FF