Формат файла hex, сокращённо от «шестнадцатеричный» или «base-16», является структурой необработанных данных, которой следуют все файлы, хранящиеся на вашем компьютере. Хотя буквально каждый документ хранится в этом формате, найти его на ПК практически невозможно. Хотя далеко не все знают, что возможность напрямую изменять необработанные биты и байты на ПК иногда может быть очень полезна.
Система счисления, которую люди используют для подсчёта, называется десятичной (числа от 0 до 9), и была изобретена персами около 6000 лет назад. В 1950-х или 1960-х годах IBM формализовала шестнадцатеричную систему счисления, которая является коротким способом представления двоичных данных. Вместо использования цифр 0-9, шестнадцатеричное число использует цифры от 0 до F. Достигнув конца числовых «цифр», вы просто увеличиваете число влево на единицу, точно так же, как вы делаете это с системой счёта десятичных чисел.
Файлы с расширением HEX имеют те же свойства, что и двоичные. Все байты размещаются один за другим. Информация об адресе или контрольные суммы не добавляются. Единственная разница с двоичным форматом такова, что каждый байт преобразуется в 2 символа ASCII в диапазоне 0-9 и A-F, представляющие 2 шестнадцатеричные цифры. Эти символы сгруппированы по строкам. Номер пары в строке обычно может варьироваться от 1 до 255, где наиболее общей длиной являются 16 или 32 пары. Каждая строка заканчивается парой CR (ASCII-значение $ 0D) или CRLF (ASCII). Для работы с такими документами требуется специальная программа-редактор хекс-файлов. Она в удобном виде выведет всю информацию и позволит достаточно комфортно её воспринимать и изменять.
Далеко не все являются программистами, и иногда открыть файл с расширением HEX может понадобиться обычному человеку, чтобы посмотреть в нём некую информацию. На самом деле для такой простой задачи вполне достаточно обычного Блокнота – стандартного приложения, которое имеется в любой системе Windows. Ведь этот файл, по сути, является текстовым, просто в нём записана специфическая информация, но обычными символами.
Для этого достаточно кликнуть на файле правой кнопкой мыши, выбрать в меню пункт «Открыть» или «Открыть с помощью», затем «Выбрать из списка установленных программ», а далее просто выбрать стандартный Блокнот. Снимите галочку с пункта «Использовать выбранную программу для всех файлов этого типа» — вдруг вы его потом будете открывать другой программой. Можно просто открыть Блокнот, а файл в него перетащить, и он откроется.
Гораздо удобнее для открытия таких файлов подходит другая версия Блокнота – Notepad++. Скачать можно по этой ссылке. Эта программа также есть у многих, так как более удобна. Но она может к тому же распознавать многие языки программирования и файлы HEX в ней выглядят гораздо удобнее, так как есть выделение цветом. Notepad++ представляет собой как бы примитивный HEX-редактор, и этим можно пользоваться совершенно свободно.
Так выглядит HEX-файл, открытый в Notepad++. В стандартном Блокноте так же, но без цвета.
А теперь рассмотрим более подробно, для чего может понадобиться открывать, а тем более изменять файлы с шестнадцатеричным содержимым. Кстати, если вы собираетесь делать это часто, то лучше скачайте и установите специальный HEX-редактор – их в Интернете довольно много. Некоторые из них подробнее рассматриваются далее.
Популярная причина, по которой вы можете использовать шестнадацтеричный редактор, – взлом игр. Вы можете загрузить документ сохранения игры и изменить сумму денег, например, от 1000 до 1000000 долларов. В более поздних играх всё сделано намного сложнее. Многие современные игры используют либо сжатие, либо шифрование, что во много раз затрудняет декомпиляцию состояния сохранения или игры. Тем не менее, некоторые игры по-прежнему позволяют редактировать определённые переменные, например, Sonic Spinball. В дополнение к просмотру файлов игры, из сохранённого файла иногда можно извлечь другую важную информацию, к которой у вас иначе не было бы доступа. Это сильно зависит от типа файла и того, какую информацию вы ищете, но использование шестнадцатеричного редактора полезно для определения того, что именно находится в документе.
Наконец, еще одна популярная причина, по которой вы можете использовать шестнадцатеричный редактор, – это если вы программист, и вам нужно отладить код. Вместо того, чтобы возвращаться к перекомпиляции кода, для проверки шаблона может потребоваться простое шестнадцатеричное редактирование. Но для начала обязательно убедитесь, что у вас есть резервная копия, прежде чем изменять какие-либо файлы с помощью шестнадцатеричного редактора.
Шестнадцатеричный редактор представляет собой софт, используемый для просмотра и редактирования бинарных файлов. Двоичный документ представляет собой документ, который содержит данные в машиночитаемой форме. HEX-редакторы позволяют изменять содержимое необработанных данных файла. Поскольку шестнадцатеричный редактор используется для редактирования двоичных файлов, их иногда называют двоичным редактором или редактором двоичных файлов. Если открыть документ с помощью шестнадцатеричного редактора, появится сообщение о том, что документ редактируется в шестнадцатеричном формате, а процесс использования шестнадцатеричного редактора называется шестнадцатеричным редактированием. Шестнадцатеричные редакторы отличаются от обычных текстовых рядом функций. Основой шестнадцатеричного редактора является то, что они отображают необработанное содержимое файла. Нет кодирования или перевода в текст – только необработанный машинный код. Во-вторых, номера строк вместо того являются адресом смещения от начала файла. Мы подобрали несколько лучших бесплатных программ для просмотра и редактирования документов HEX.
HxD – это бесплатный шестнадцатеричный редактор, который может открывать и изменять компьютерный код. Это очень мощная утилита в правильных руках, которая может проверять, сравнивать и диагностировать файлы, диски, образы дисков, память и журналы, а также исправлять ошибки и восстанавливать структуру диска.
Преимущества:
Недостатки:
Один из лучших hex-редакторов на основе библиотеки deltahex. Используйте действие «Открыть как шестнадцатеричный» в главном меню «Файл» или в контекстном меню файлов проекта.
Характеристики:
Free Hex Editor Neo – это самый быстрый бесплатный редактор двоичных файлов для платформы Windows. Алгоритмы обработки данных Neo Hex Editor чрезвычайно оптимизированы и тщательно настроены для обработки операций с большими файлами.
Характеристики программы:
Функции и возможности утилиты:
Hex Editor Neo предоставляет базовые, расширенные и даже инновационные функции. Шестнадцатеричное редактирование теперь доступно каждому начинающему пользователю!
Любимый шестнадцатеричный редактор большинства программистов. PSPad, помимо того, что он является отличным редактором текста и кода, предлагает опцию «Открыть в HEX Editor…», которая запускает специальный режим редактирования. Когда вы находитесь в этом режиме, вы можете увидеть местоположение и шестнадцатеричные значения каждого бита файла. У вас есть два варианта корректировки – вы можете редактировать шестнадцатеричные значения по местоположению, или справа у вас есть буквенно-цифровое представление этого значения, которое вы также можете редактировать.
XVI32 также очень способный шестнадцатеричный редактор. Как и в PSPad, вы можете редактировать шестнадцатеричные значения напрямую или через отображение символов. В нём также есть несколько расширенных инструментов редактирования шестнадцатеричных кодов, таких как калькулятор адресов для проверки смещений и других специфичных для шестнадцатеричных данных параметров, которые могут помочь вам обойти шестнадцатеричный документ. Если вы, конечно, знаете, что делаете.
Знание того, как работает ваш ПК, становится всё более и более важным, поскольку техника становится всё проще и проще в использовании. Если у вас остались вопросы относительно редактирования шестнадцатеричных файлов, оставьте комментарий под этой статьёй.
Формат Intel-HEX
Шестнадцатиричный объектный формат файлов Intel-HEX (далее просто HEX-формат) – это способ представить двоичные данные в виде кодов ASCII. Поскольку файл состоит из символов ASCII, а не двоичных кодов, появляется возможность хранить данные на бумаге, перфоленте или перфокартах, выводить их на терминал, принтер и т.д. Восьмибитовый HEX-формат файлов предусматривает размещение данных и кода в 16-разрядном линейном адресном пространстве для 8-разрядных процессоров Intel. 16-разрядный HEX-формат файлов дополнительно позволяет использовать 20-разрядное сегментное пространство адресов 16-разрядных процессоров Intel. И, наконец, 32-разрядный формат позволяет оперировать линейным 32-разрядным адресным пространством 32-разрядных процессоров.
Шестнадцатиричное представление двоичных данных в виде ASCII требует использование двух символов для записи одного байта, при этом первый символ всегда соответствует старшей тетраде битов одного байта. Такой подход увеличивает количество символов в двое по сравнению с количеством двоичных данных.
Формат файла организован в виде набора записей, содержащих сведения о типе, количестве данных, адресе их загрузки в память и дополнительные сведения. В настоящее время определены шесть различных типов записей, однако не все их комбинации определены для разных форматов данных.
Записи могут быть следующих типов:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Данные DATA |
Контрольная сумма CHECKSUM |
: | 1 байт | 2 байта | 1 байт | RECLEN байт | 1 байт |
Каждая запись представляет собой ASCII-строку файла. В одной строке – одна запись.
Каждая запись начинается с МАРКЕРА ЗАПИСИ, который обозначается ASCII-символом двоеточие («:»).
Каждая запись содержит поле RECLEN, определяющее количество байтов данных или информационных байтов, назначение которых определяется типом записи. Максимальное значение этого поля – 255 (0xFF).
Каждая запись содержит поле OFFSET, определяющее 16-битное смещение в адресном пространстве байтов данных. Это поле используется только в записях данных, а в остальных случаях оно должно быть равно нулю.
Каждая запись содержит поле TYPEREC, определяющее тип текущей записи (из ранее упомянутых шести). Это поле используется для интерпретации всех остальных полей записи. Типы записей кодируются следующими значениями поля TYPEREC (в ASCII):
Каждая запись содержит поле DATA переменной длины, которое содержит ноль или более байтов, закодированных символами ASCII. Назначение этих байтов определяется типом записи.
Наконец, каждая запись завершается полем CHECKSUM, гарантирующим целостность всех данных записи. Значение этого поля равно дополнению по модулю 256 до нуля суммы по модулю 256 всех байтов, начиная с поля RECLEN и заканчивая последним байтом поля DATA. При считывании записи следует суммировать по модулю 256 все байты записи, включая поле CHECKSUM. Если в конце концов сумма равна нулю, это означает, что данные считаны без искажений, в противном случае данные недостоверны.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Данные ULBA |
Контрольная сумма CHECKSUM |
: | 02 | 0000 | 04 | 2 байта | 1 байт |
Эта запись служит для задания значения битов 16-31 в линейном базовом адресе (LBA, Linear Base Address), причем биты 0-15 LBA равны нулю. Биты 16-31 LBA определяются верхним линейным базовым адресом (ULBA, Upper Linear Base Address). Абсолютное значение адреса байта данных в памяти определяется как сумма значения LBA и значения поля OFFSET в последующих записях данных, плюс индекс байта данных внутри поля DATA. Эта сумма выполняется без учёта переполнения результата (то есть не может превышать 0xFFFFFFFF, 4 Гб).
Фактический линейный адрес байта данных вычисляется в итоге по формуле:
ByteAddr = (LBA + DRLO + DRI) mod 4G,
где: DRLO – значение поля OFFSET записи данных;
Когда запись «Линейный адрес» встречается в файле, вычисляется значение LBA, которое действует для всех последующих записей данных, пока не встретится снова запись «Линейный адрес». По умолчанию LBA = 0.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Данные USBA |
Контрольная сумма CHECKSUM |
: | 02 | 0000 | 04 | 2 байта | 1 байт |
Эта запись служит для задания значения битов 4-19 сегментного базового адреса (SBA, Segment Base Address), где биты 0-3 SBA равны нулю. Биты 4-19 SBA определяются верхним базовым адресом сегмента (USBA, Upper Segment Base Address). Абсолютный адрес байта в записи данных вычисляется путем прибавления к SBA значения поля OFFSET записи данных и индекса байта относительно начала поля DATA. Прибавление смещения (OFFSET) осуществляется по модулю 65536 (64 К), без учёта переполнения.
Таким образом, адрес конкретного байта вычисляется по формуле:
ByteAddr = SBA + (DRLO + DRI) mod 64K,
где: DRLO – значение поля OFFSET записи данных;
DRI – индекс байта в поле DATA записи данных;
mod 64K – операция «сложение по модулю 65536».
Когда запись «Адрес сегмента» встречается в файле, вычисляется значение SBA, которое действует для всех последующих записей данных, пока не встретится снова запись «Адрес сегмента». По умолчанию SBA = 0.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Данные DATA |
Контрольная сумма CHECKSUM |
: | 1 байт | 2 байта | 00 | RECLEN байтов | 1 байт |
Эта запись собственно и содержит данные. Метод вычисления фактического (абсолютного) адреса каждого байта данных в памяти определяется по вышеприведённым формулам и зависит от формата данных.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
OFFSET |
Тип записи TYPEREC |
Данные EIP |
Контрольная сумма CHECKSUM |
: | 04 | 0000 | 05 | 4 байта | 1 байт |
Запись «Линейный адрес старта» используется для указания адреса, с которого начинается исполнение объектного файла. Это значение заносится в регистр EIP процессора. Следует обратить внимание, что эта запись определяет только точку входа сегмента кода для защищённого режима процессоров 80386. В обычном режиме точка старта определяется записью «Сегментный адрес старта», которая определяет значения пары регистров CS:IP.
Запись «Линейный адрес старта» может находиться в любом месте файла. Если её нет, загрузчик использует адрес старта по умолчанию.
Значение регистра EIP процессора содержится в соответствующем поле записи, для него требуется всегда 4 байта.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Данные CS:IP |
Контрольная сумма CHECKSUM |
: | 04 | 0000 | 03 | 4 байта | 1 байт |
Запись «Сегментный адрес старта» используется для указания адреса, с которого начинается исполнение объектного файла. Это значение определяет 20-битный адрес, заносимый в регистры CS:IP процессора. Следует обратить внимание, что эта запись определяет только точку входа в 20-битном адресном пространстве процессоров 8086/80186.
Запись «Сегментный адрес старта» может находиться в любом месте файла. Если её нет, загрузчик использует значение по умолчанию.
Значение регистров CS:IP процессора содержится в соответствующем поле записи, для него требуется всегда 4 байта. Значение хранится в порядке «от старшего к младшему», то есть младший байт значения регистра IP хранится в четвертом байте поля CS:IP, старший – в третьем, затем во втором хранится младший байт значения регистра CS, и в первом – старший байт регистра CS.
Формат записи следующий:
Маркер записи |
Кол-во данных RECLEN |
Смещение OFFSET |
Тип записи TYPEREC |
Контрольная сумма CHECKSUM |
: | 00 | 0000 | 01 | 1 байт |
Эта запись не содержит полей с изменяющимися данными, поэтому выглядит всегда совершенно одинаково: «:00000001FF». Запись обозначает конец данных в файле. Все последующие строки, если они есть в файле, игнорируются.
:10010000214601360121470136007EFE09D2190140
:100110002146017EB7C20001FF5F16002148011988
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
Маркер записи
Кол-во данных
Смещение
Тип записи
Данные
Контрольная сумма
Текстовый файл ASCII (с расширением .hex). Вы можете использовать шестнадцатеричный файл (формат Intel) (.hex) в Квартус ® Прайм программное обеспечение для хранения начальных значений памяти для блока памяти, такого как RAM или ROM, то есть реализованный в устройстве FPGA, или для создания исполняемых файлов программного проекта.
Вы можете использовать файлы .hex как входные файлы в Квартус ® Программное обеспечение Prime в следующем способы:
Формат каждой строки в
.hexfile это
следующим образом: :AABBBBCCDD"¦DDEE | |
---|---|
Код | Определение |
| количество байт в поле данных
( |
| начальный адрес |
| Тип (00 = данные, 01 = конец файла, 02 = смещение адреса) |
| поле данных |
| значение контрольной суммы |
Важно: из-за сложности шестнадцатеричного (Intel-Format) Тип файла, Intel рекомендует использовать Quartus ® Prime Memory Editor для создавать файлы .hex. |
Вы можете хранить данные конфигурации для одного или нескольких устройств Intel. в выходной файл, называемый шестнадцатеричным (Intel-Format) выходным файлом (.шестнадцатеричный). Формат файла .hexout представляет собой текстовый файл ASCII. с расширением .hexout, чтобы избежать перезаписи начального файлы содержимого памяти с расширением .hex.
Ширина данных .hex файл всегда кратен 8 битам. Когда вы инициализируете память блок, ширина которого отличается от ширины файла .hex, Квартус ® Программное обеспечение Prime оборачивает или дополняет файл, как описано в таблице ниже:
Ширина данных файла больше, чем ширина памяти | Ширина данных файла меньше ширины памяти |
---|---|
Размер памяти кратное 8:
Объем памяти не кратно 8: Программное обеспечение Quartus ® Prime упаковывает данные в ширина памяти, кратная 8 и чуть больше фактическая ширина памяти, а затем усекает блок памяти до реальный размер ширины памяти, не кратный 8. |
|
Если размер файла .hex не соответствует размеру память, которую вы инициализируете, Программное обеспечение Quartus ® Prime работает, как описано в таблице ниже:
Глубина данных файла больше, чем глубина памяти | Глубина данных файла меньше глубины памяти |
---|---|
Игнорирует дополнительные данные. |
|
Примечание. Глубина данных файла относится к количеству адресов, которые вы инициализируете. квартус
Программное обеспечение II заполняет адреса, которые вы не инициализируете, нулями или < F…F
>, в зависимости от того, является ли глубина данных файла UFM или
нет.
Примечание:
в Программное обеспечение Quartus ® Prime, у вас есть возможность чтения или запись файлов .hex в режим байтовой адресации (шестнадцатеричный формат Intel) или адресуемый по словам режим. Вы можете выбрать один из двух режимов, изменение Чтение или запись Шестнадцатеричные файлы (.hex) с использованием байтовой адресации (Intel формат) вариант в Квартус ® Программное обеспечение Prime. Установка этого на странице «Редактор памяти» в разделе «Параметры». диалоговое окно. Включение этой опции для текущего проекта переопределяет глобальную настройку.
Программное обеспечение Quartus ® Prime всегда читает слово адресуемые файлы .hex в адресный режим слова, даже если чтение или запись шестнадцатеричных файлов (.hex) с использованием байтовая адресация (формат Intel) включена.
Когда вы создаете программу для Microchip PIC, компилятор создаст файл сборки, который будет собран в двоичный файл с суффиксом .hex для загрузки в микроконтроллер. Двоичный файл содержит 1 и 0, которые составляют команды машинного языка, которые в конечном итоге управляют внутренней работой микроконтроллера. Бывают случаи, когда вам может понадобиться знать структуру этого двоичного файла, особенно если вы хотите создать собственную программу загрузчика для программирования микроконтроллера. В этой статье я опишу, как понять структуру этого бинарного файла.
Сначала создадим простую программу на Great Cow Basic. Эта программа будет мигать светодиодом, подключенным к цифровому контакту 13 на модуле CHIPINO.
Созданный файл ассемблерного кода доступен и может быть легко просмотрен в окне рядом с файлом Basic. Я буду использовать это для справки в разделах ниже. Но сначала давайте посмотрим на файл .hex, созданный, когда этот файл сборки собирается в двоичный файл .hex.
;Векторы
ORG 0
перейти к BASPROGRAMSTART
ORG 4
retfie
;************************************************ *******
;Начало страницы памяти программ 0
ORG 5
BASPROGRAMSTART
;Вызов процедур инициализации
вызов INITSYS
;Автоматическая установка направления выводов ;Программа для мигания двух светодиодов на PORTB, биты 0 и 1
;Модель микросхемы
;Основная процедура
START
;SET D13 ON
bankel PORTB
bsf PORTB,5
; подождите 1 сек
Movlw 1
Movwf Syswaittemps
Call Doply_S
; SET D13 OFF
BCF PORTB, 5
; WAIT 1 SEC
MOVLW 1
MOVWF SYSWAITEMP
333333333333333333333333333333 гг. goto BASPROGRAMEND
Программа скомпилирована и собрана и создает двоичный файл .hex, как показано на рисунке 2. Этот файл был открыт в текстовом редакторе блокнота, так что это необработанный файл. Казалось бы, очень сложно понять код из этого странного набора символов, но давайте разберем его, и вы увидите, что он не такой уж и запутанный.
Рисунок 2: Двоичный файл .HEX
Прежде всего, поймите, что этот файл .hex имеет формат Intel Hex32. Это означает, что он может поддерживать 32-битные адресные устройства памяти. Но формат разбит на верхние 16 бит и младшие 16 бит. Старшие 16 бит известны как расширенный адрес.
Каждая новая строка начинается с двоеточия. Затем цифры и буквы, которые следуют, являются шестнадцатеричными кодами, которые являются управляющими символами, адресами или байтами данных. Каждая строка в файле имеет следующий формат:
:BBaaAATTDDCC
BB содержит количество байтов данных в строке.
aaAA — адрес в памяти, где будут храниться байты. Это число на самом деле удвоено, о чем я расскажу чуть позже. Кроме того, младший байт — это первый aa , за которым следует старший байт AA .
TT — это тип данных.
00 — означает данные программы.
01 – означает конец файла (EOF).
04 – означает расширенный адрес. Это указывает на то, что значение данных является старшими 16 битами адреса.
DD — это фактические байты данных, которые содержат машинный код, созданный вашей программой. В одной строке может быть несколько байтов. Значение BB указывает, сколько байтов содержится в строке.
CC вычисляется значение контрольной суммы для контроля ошибок. Это вычисление с дополнением до 2: BB + AAAA + TT + DD.
Итак, давайте посмотрим на первую строку.
:020000040000FA
02 указывает количество байтов в строке. В данном случае это два байта.
0000 — это адрес памяти для размещения байтов, но его значение было умножено на 2. Обычно мы делим адрес на 2, но в данном случае 0000/2 = 0000. Таким образом, адрес равен 0000.
04 означает, что это расширенный адрес. Таким образом, данные содержат старшие 16 бит адреса. Любые адреса младших битов, которые следуют за этой строкой, будут использовать эти старшие биты, пока новая строка 04 не изменит старшие биты.
0000 это старшие 16 бит адреса, обозначенного типом данных 04.
FA — это дополнение 2 к сумме байтов: 02 + 00 + 00 + 04 + 00 + 00.
Примечание : дополнение 2 — это просто инвертированное двоичное значение, к которому прибавляется 1. Затем результат конвертируется в формат .hex.
, т.е.
02 + 00+ 00 + 04 + 00 + 00 = 06 = 00000110 двоичный двоичный будет иметь верхний (расширенный) адрес 0000 и начнется с адреса памяти 00000000 в PIC Microchip.
Следующая строка разбивается следующим образом:
:020000000528D1
02 указывает на два байта данных.
0000 снова адрес.
00 — это тип данных, поэтому байты данных — это данные программы.
0528 — это два байта данных. Но они перевернуты, так как младший байт стоит первым, так что это действительно 2805 шестнадцатеричный.
D1 — контрольная сумма дополнения 2.
Таким образом, по адресу 00000000 (расширенное и младшее слово вместе) байт данных программы 2805 сохранен. Но что означает этот байт?
Для этого нам необходимо обратиться к спецификации PIC16F886 (рис. 3). В техпаспорте указан набор инструкций по ассемблерному коду. И для каждой инструкции в таблице 15-2 ниже показан 14-битный код операции. Это двоичный машинный код инструкции.
Таким образом, преобразуя 2805 в двоичный код, мы получаем 0010100000000101. Поскольку PIC16F886 использует 14-битный код операции, мы можем игнорировать первые два бита, которые являются нулями. Это оставляет нас с 10100000000101. Если затем просмотреть список кодов операций, мы обнаружим, что этот код соответствует инструкции GOTO 10 1kkk kkkk kkkk. Часть kkk.. представляет адрес для перехода. В этом случае значение после 101 для goto оставляет значение 00000000101 или шестнадцатеричное значение 05.
Таким образом, это означает, что эта строка в шестнадцатеричном файле представляет собой командную строку GOTO 0x05 .
Рисунок 3: Инструкции PIC16F886 и команда GOTO
Давайте посмотрим, верен ли наш анализ. Я буду использовать Real Pic Simulator для загрузки файла .hex, так как он имеет возможность дизассемблировать файл .hex обратно в команды сборки. На рисунке 4 показаны результаты, и первая строка подтверждает наш анализ.
Рисунок 4: Окно разборки
Но что такое L0005H?
На самом деле это метка, созданная в дизассемблере для обозначения того, куда «идти». Мы должны посмотреть на строку 0005h, чтобы увидеть эту метку.
И это подтверждает правильность нашего анализа. GOTO 0005h привел программу к адресу 0005h.
Мы также можем видеть это в верхней части файла сборки из ранее.
Директива ассемблера ORG 0 указывает, что код под ней следует разместить по адресу памяти 0000h. В этой строке находится командная строка:
ПЕРЕЙТИ К БАСПРОГРАММЕ СТАРТ. Посмотрите немного дальше и мы увидим ORG 5 для адреса 0005h и метку BASPROGRAMSTART.
Таким образом, наш GOTO 0005h также соответствует файлу сборки.
ORG 0
перейти к BASPROGRAMSTART
ORG 4
восстановить
;****************************************** **************
;Начало страницы памяти программ 0
ORG 5
BASPROGRAMSTART
Итак, теперь мы можем перейти к следующей строке.
:1000080009002C2083160313861283120313861605
Похоже, там много чего происходит. Давайте сломаем это.
10 указывает 16 байтов данных. Помните, что это шестнадцатеричное значение, поэтому 10 шестнадцатеричных на самом деле 16 десятичных.
0008 — это адрес, и на этот раз мы должны разделить его на 2. 0008 / 2 = 0004h.
Таким образом, данные будут помещены в ячейку памяти 00000004h.
00 — это тип данных, поэтому байты данных — это данные программы.
0900 — первые два байта данных. Но опять же, они меняются местами, так как младший байт идет первым, так что это действительно 0090 шестн.
This byte is followed by 14 more so I’ll list them in high byte –low byte format:
202C
1683
1303
1286
1283
1303
1686
05 — это контрольная сумма дополнения 2.
Сейчас я не буду перечислять их все, но мы можем посмотреть на первую пару и преобразовать их в 14-битный опкод, удалив первые два нуля.
0009 или 00000000001001 точно соответствует команде RETFIE или RETurn From Interrupt Enable.
RETFIE – 00000000001001
Таким образом, в ячейке памяти 0x0004 находится RETFIE
202C или 10000000101100. Это нужно разбить.
100 – соответствует команде подпрограммы CALL.
CALL – 100kkkkkkkkkkk
Буквы K обозначают ячейку памяти для вызова или перехода.
00000101100 – это ячейка памяти для вызова, которая представляет собой 2C hex или ячейку памяти 0x002C
Таким образом, в ячейке памяти 0x0005 находится CALL 0x002C
1683 или 01011010000011. Это нужно разбить.
0101 – соответствует команде BSF или регистру файла установки битов
BSF — 0101bbbfffffff
BSF состоит из двух частей; bbb и fffff .
bbb — место установки бита.
fffff — адрес регистра, содержащего этот бит.
fffff – это 0000011 или адрес памяти 0x0003h.
Если мы посмотрим на карту памяти PIC16F886 (в Real Pic Simulator), мы увидим, что регистр STATUS находится в ячейке памяти 0x0003h.
bbb – это 101 или номер бита 5.
Таким образом, бит 5 регистра состояния будет установлен в 1 при выполнении этой инструкции. Это бит RP0, если вы посмотрите на этот регистр в таблице данных.
Таким образом, в ячейке памяти 0x0006 находится BSF RP0, СТАТУС
Если мы вернемся назад и снова посмотрим на рисунок 4, мы увидим, что код соответствует нашему анализу.
Я мог бы продолжить оставшуюся часть файла, но, кажется, я показал вам, как все это работает.
Последняя строка в файле .hex:
:00000001FF
Эта строка разбивается следующим образом:
00 указывает на отсутствие байтов данных.
0000 — это снова адрес, но это бессмысленно, поскольку у нас нет байтов данных для хранения.
01 — это тип данных, указывающий, что это конец файла.
FF — контрольная сумма дополнения 2.
Эта строка означает, что вы достигли конца файла.
В качестве последнего шага давайте загрузим файл .hex в окно программатора PICkit 2, чтобы посмотреть, что он покажет. Окно памяти программы показывает адрес в самом левом углу и слова данных в шестнадцатеричном формате по всему экрану.
то есть
0000 2805 3FFF 3FFF 3FFF 0009202C 1683 1303
Рисунок 5: Представление памяти PICkit 2
Вы можете видеть, что шестнадцатеричные значения, которые мы извлекли из файла .