Расширение имени файла | .hex, .h86, .hxl, .hxh, .obl, .obh, .mcs, .ihex, .ihe, .ihx, .a43 |
---|
шестнадцатеричный формат объектного файла Intel, шестнадцатеричный формат Intel или Intellec Hex - это формат файла, который передает двоичную информацию в ASCII текстовая форма. Он обычно используется для программирования микроконтроллеров, EPROM и других типов программируемых логических устройств. В типичном приложении компилятор или ассемблер преобразует программу в исходный код (например, в C или язык ассемблера ) в машинный код и выводит его в файл HEX. Общие расширения файлов, используемые для полученных файлов, -.HEX или.H86. Затем файл HEX читается программистом для записи машинного кода в PROM или передается в целевую систему для загрузки и выполнения.
Шестнадцатеричный формат 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 запись (строка текста) состоит из шести полей (частей), которые появляются в порядке слева направо:
В качестве наглядного пособия поля записей 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, которые используют определенные подмножества типов записей. Например:
В этом примере показан файл, содержащий четыре записи данных, за которыми следует конец файла. запись:
: 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.