Intel HEX

редактировать

Intel шестнадцатеричный
Расширение имени файла .hex, .h86, .hxl, .hxh, .obl, .obh, .mcs, .ihex, .ihe, .ihx, .a43

шестнадцатеричный формат объектного файла Intel, шестнадцатеричный формат Intel или Intellec Hex - это формат файла, который передает двоичную информацию в ASCII текстовая форма. Он обычно используется для программирования микроконтроллеров, EPROM и других типов программируемых логических устройств. В типичном приложении компилятор или ассемблер преобразует программу в исходный код (например, в C или язык ассемблера ) в машинный код и выводит его в файл HEX. Общие расширения файлов, используемые для полученных файлов, -.HEX или.H86. Затем файл HEX читается программистом для записи машинного кода в PROM или передается в целевую систему для загрузки и выполнения.

Содержание

  • 1 История
  • 2 Формат
    • 2.1 Структура записи
      • 2.1.1 Цветовая легенда
      • 2.1.2 Расчет контрольной суммы
    • 2.2 Знаки конца строки текста
    • 2.3 Типы записей
    • 2.4 Именованные форматы
  • 3 Пример файла
  • 4 варианта
  • 5 См. Также
  • 6 Ссылки
  • 7 Дополнительная литература
  • 8 Внешние ссылки

История

Шестнадцатеричный формат Intel был первоначально разработан для Intel Intellec Microcomputer Development Systems (MDS) в 1973 году для загрузки и выполнения программ с бумажной ленты, чтобы заменить «бумажно-интенсивный» / формат. Кроме того, это служило цели облегчения передачи данных от клиентов в Intel для производства ПЗУ. Формат использовался для программирования (E) PROM с помощью бумажных лент (в формате Intellec Hex Paper Tape Format) или для управления перфокартой программаторами EPROM (через Intellec Hex Computer Punched Card Format)

.

С 1975 года он также использовался в системах ISIS-II на основе гибких дисков Series II с расширением файла HEX.

Формат

Intel HEX состоит из строк текста ASCII, разделенных символами перевода строки или возврата каретки или обоими. Каждая текстовая строка содержит шестнадцатеричные символы, которые кодируют несколько двоичных чисел. Двоичные числа могут представлять данные, адреса памяти или другие значения, в зависимости от их положения в строке, а также от типа и длины строки. Каждая текстовая строка называется записью.

Структура записи

A запись (строка текста) состоит из шести полей (частей), которые появляются в порядке слева направо:

  1. Начальный код, один символ, двоеточие ASCII ':'.
  2. Число байтов, две шестнадцатеричные цифры (одна пара шестнадцатеричных цифр), указывающие количество байтов (пары шестнадцатеричных цифр) в поле данных. Максимальное количество байтов - 255 (0xFF). Обычно используются числа байтов 16 (0x10) и 32 (0x20).
  3. Адрес, четыре шестнадцатеричных цифры, представляющие 16-битное смещение начального адреса памяти данных. Физический адрес данных вычисляется путем добавления этого смещения к ранее установленному базовому адресу, что позволяет адресовать память за пределами 64-килобайтного ограничения 16-битных адресов. Базовый адрес, который по умолчанию равен нулю, может быть изменен различными типами записей. Базовые адреса и смещения адресов всегда выражаются в виде значений big endian.
  4. Тип записи (см. типы записей ниже), две шестнадцатеричные цифры от 00 до 05, определяющие значение поля данных.
  5. Данные, последовательность из n байтов данных, представленных 2n шестнадцатеричными цифрами. В некоторых записях это поле отсутствует (n равно нулю). Значение и интерпретация байтов данных зависит от приложения.
  6. Контрольная сумма, две шестнадцатеричные цифры, вычисленное значение, которое можно использовать для проверки отсутствия ошибок в записи.

Цветовая легенда

В качестве наглядного пособия поля записей Intel HEX в этой статье окрашены следующим образом:

Начальный код Количество байтов Адрес Тип записи Данные Контрольная сумма

Расчет контрольной суммы

Байт контрольной суммы записи - это два дополнения младшего значащего байта (LSB) суммы всех декодированных байтовых значений в запись, предшествующая контрольной сумме. Он вычисляется путем суммирования декодированных значений байтов и извлечения младшего разряда суммы (т. Е. Контрольной суммы данных), а затем вычисления двух дополнений младшего разряда (например, путем инвертирования его битов и добавления единицы).

Например, в случае записи: 0300300002337A1E сумма декодированных байтовых значений составляет 03 + 00 + 30 + 00 + 02 + 33 + 7A = E2, что имеет Значение LSB E2. Дополнение до двух E2равно 1E, то есть байту контрольной суммы, появляющемуся в конце записи.

Действительность записи можно проверить, вычислив ее контрольную сумму и убедившись, что вычисленная контрольная сумма равна контрольной сумме, указанной в записи; отображается ошибка, если контрольные суммы различаются. Поскольку байт контрольной суммы записи является дополнением до двух - и, следовательно, аддитивно обратным - контрольной суммы данных, этот процесс можно свести к суммированию всех декодированных значений байтов, включая контрольную сумму записи, и проверки того, что младший бит сумма равна нулю. В применении к предыдущему примеру этот метод дает следующий результат: 03 + 00 + 30 + 00 + 02 + 33 + 7A + 1E = 100, что имеет значение LSB 00.

Знаки конца текстовой строки

Записи Intel HEX разделяются одним или несколькими символами завершения строки ASCII, поэтому каждая запись появляется отдельно в текстовой строке. Это улучшает читаемость за счет визуального разделения записей, а также обеспечивает заполнение между записями, которое можно использовать для повышения эффективности машинного синтаксического анализа.

Программы, создающие записи HEX, обычно используют символы завершения строки, соответствующие соглашениям их операционных систем. Например, программы Linux используют один символ LF (перевод строки, шестнадцатеричное значение 0A) для завершения строк, тогда как программы Windows используют CR (возврат каретки, шестнадцатеричное значение 0D), за которым следует LF.

Типы записей

Intel HEX имеет шесть стандартных типов записей:

Шестнадцатеричный кодТип записиОписаниеПример
00ДанныеСодержит данные и 16-битный начальный адрес для данных. Счетчик байтов определяет количество байтов данных в записи. Пример, показанный справа, имеет 0B (одиннадцать) байтов данных (61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70), расположенных по последовательным адресам, начинающимся с адреса 0010.: 0B0010006164647265737320676170A7
01Конец файлаДолжен встречаться ровно один раз для каждого файла в последней строке файла. Поле данных пустое (таким образом, количество байтов равно 00), а поле адреса обычно равно 0000.: 00000001FF
02Адрес расширенного сегментаПоле данных содержит 16-битный базовый адрес сегмента (таким образом, количество байтов всегда равно 02), совместимый с адресацией в реальном режиме 80x86. Поле адреса (обычно 0000) игнорируется. Адрес сегмента из самой последней записи 02 умножается на 16 и добавляется к каждому последующему адресу записи данных, чтобы сформировать физический начальный адрес данных. Это позволяет адресовать до одного мегабайта адресного пространства.: 020000021200EA
03Адрес начального сегментаДля процессоров 80x86 указывает начальное содержимое регистров CS: IP (т. Е. Начальный адрес выполнения). Поле адреса - 0000, количество байтов всегда равно 04, первые два байта данных - это значение CS, последние два - значение IP.: 0400000300003800C1
04Расширенный линейный адресОбеспечивает 32-битную адресацию (до 4 ГиБ). Поле адреса записи игнорируется (обычно 0000), а его счетчик байтов всегда равен 02. Два байта данных (big endian) определяют старшие 16 бит 32-битного абсолютного адреса для всех последующих записей типа 00; эти старшие биты адреса применяются до следующей записи 04. Абсолютный адрес для записи типа 00 формируется путем объединения старших 16 бит адреса самой последней записи 04 с младшими 16 битами адреса записи 00. Если записи типа 00 не предшествуют записи типа 04, то ее старшие 16 бит адреса по умолчанию равны 0000.: 02000004FFFFFC
05Начальный линейный адресПоле адреса - 0000 (не используется), а счетчик байтов всегда равен 04. Четыре байта данных представляют 32-битное значение адреса (с прямым порядком байтов). В случае процессоров 80386 и выше этот адрес загружается в регистр EIP.: 04000005000000CD2A

Именованные форматы

Исходный 4-битный / 8-битный формат Intellec Hex Paper Tape Format и Intellec Hex Computer Punched Card Format поддерживал только типы записей 00 и 01.

Расширенный шестнадцатеричный формат Intellec дополнительно поддерживает тип записи 02.

Специальные имена иногда используются для обозначения форматов файлов HEX, которые используют определенные подмножества типов записей. Например:

  • файлы I8HEX используют только типы записей 00 и 01 (16-битные адреса)
  • I16HEX файлы используют только типы записей с 00 по 03 (20-битные адреса)
  • I32HEX файлы используют только типы записей 00, 01, 04 и 05 (32-битные адреса)

Пример файла

В этом примере показан файл, содержащий четыре записи данных, за которыми следует конец файла. запись:

: 10010000214601360121470136007EFE09D2190140: 100110002146017E17C20001FF5F16002148011928: 10012000194E79234623965778239EDA3F01B2CAA7: 100130003F0156702B5E712B722B732146013421C7: 00000001FF

Начальный код Byte Count Адрес Тип записи Данные Контрольная сумма

Варианты

Помимо собственного расширения Intel, несколько сторонних компаний также определили варианты и расширения шестнадцатеричного формата Intel, включая Digital Research (как в так называемом "шестнадцатеричном формате Digital Research"), Zilog, Texas Instruments, Microchip и c't. Они могут содержать информацию о точках входа в программу и содержимом регистров, об измененном порядке байтов в полях данных и других различиях.

Шестнадцатеричный формат Digital Research для процессоров 8086 поддерживает информацию о сегментах путем добавления типов записей, чтобы различать код, данные, стек и дополнительные сегменты.

Большинство ассемблеров для CP / M- 80 (а также для Motorola 6809 ) не используют тип записи 01h для обозначения конца файла, а вместо этого используют запись с типом данных нулевой длины 00h. Это упрощает объединение нескольких шестнадцатеричных файлов.

Texas Instruments определяет вариант, в котором адреса основаны на разрядности регистров процессора, а не на байтах.

Microchip определяет варианты INTHX8S (INHX8L, INHX8H), INHX8M, INHX16 (INHX16M) и INHX32 для своих микроконтроллеров PIC.

кросс-макроассемблер AS Альфреда Арнольда, Werner Hennig-Roleff 8051 -эмулятор SIM51 и кросс-преобразователь BINTEL Маттиаса Р. Пола также известны для определения расширений шестнадцатеричного формата Intel.

См. Также

Ссылки

Дополнительная литература

Внешние ссылки

  • binex - преобразователь между Intel HEX и двоичным кодом для Windows.
  • SRecord, преобразователь между Intel HEX и двоичным кодом для Linux (использование ), исходный код C ++.
  • kk_ihex, библиотека C с открытым исходным кодом для чтения и записи Intel HEX
  • libgis, библиотека C с открытым исходным кодом, конвертирующая Intel HEX, Motorola S-Record, Файлы Atmel Generic.
  • bincopy - это пакет Python для работы с файлами Intel HEX.
Последняя правка сделана 2021-05-24 03:57:42
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте