Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5 |
67 |
5Исследование битовых полей машинного кода с помощью дизассемблера.
Лабораторная работа № 4
Цель. Изучить структуру и алгоритм формирования hex-файлов, получить навыки редактирования таких файлов.
Внастоящей лабораторной работе мы продолжим знакомиться с ассемблером. Как мы уже говорили ассемблер – это специфический язык. Программирование на нём осуществляется почти на уровне железа, на уровне архитектуры ядра микроконтроллера. Следовательно, сколько архитектур, столько и ассемблеров. К ассемблеру мало подходит слово «изучить», к нему больше подходит слово «выучить» как, например, таблицу умножения. Если в таблице умножения требуется запомнить значения сомножителей и результат перемножения, то в случае ассемблера требуется запомнить мнемонику команды и результат её элементарного воздействия на состояние микроконтроллера. В руководствах по семейству микроконтроллеров система команд записывается в виде таблицы, где кратко поясняется назначение каждой команды. Если чуть прищуриться;-) то она будет очень похожа на таблицу умножения.
Несмотря на достаточно большое разнообразие систем команд, есть в них общая черта
–это структура команды, она у всех одинакова. Каждая ассемблерная команда состоит из двух основных частей: символьного кода операции (КОП, англ. COP) и символьного кода операндов. А машинный код, соответственно, состоит из двух битовых полей: поля кода операции и поля кода операндов, рисунок 35.
Рисунок 35. Формат листинга
Если в символьном коде мы можем легко различить две составные части команды, то в машинном коде всё несколько сложнее. Тема этой лабораторной работы в основном и посвящена исследованию структуры машинного кода.
В профессиональной жизни встречаются случаи, когда приходится модифицировать уже работающую программу сторонних разработчиков с целью некоторого изменения её параметров. Сейчас мы научимся это делать, образно говоря, мы научимся разговаривать с микропроцессором на его родном машинном языке.
Ниже на стр. 72 (Рис. 39) изображена машинная программа для микроконтроллера. Она записана в формате машинного кода. Это почти «фотография» памяти контроллера после его программирования. Такие программы на профессиональном жаргоне называют «прошивкой», а процесс программирования «заливкой» программы.
Программирование происходит путём передачи в контроллер с помощью специальных
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5 |
68 |
устройств пакетов данных. Каждый пакет данных имеет свою структуру. Строка в hex-файле как раз и представляет из себя такой пакет данных. Чтобы её отредактировать, нужно обязательно соблюдать правила формирования этой строки. А ещё нужно знать смысл отдельных фрагментов машинного кода. Выполняя эту лабораторную работу, можно почувствовать, насколько был труден хлеб первых программистов. Страшно представить, как можно было написать и отладить большую программу в машинных кодах.
1.Получить у преподавателя ассемблерную команду для исследования.
2.Создать новый проект.
3.Создать файл исходного кода функции (скелета) на языке Assembler и включить его в проект.
4.Изменить настройки проекта (options) таким образом, чтобы сформировался загрузочный код вашей программы в Intel-HEX формате.
5.Написать исходный ассемблерный файл так, чтобы его машинный код легко находился в сформированном hex-файле в обычном текстовом редакторе.
6.Изучить формат hex-файла. Отметить различия в представлении машинного кода в дизассемблере и hex-файле.
7.Последовательно меняя операнды заданной команды, исследовать назначение битовых полей машинного кода этой команды.
Техника анализа битовых полей машинного кода хорошо описана в отчёте студентов 539гр. Бушуевой Анастасии Олеговны и Климова Владимира Сергеевича. В конце отчёта есть шутливая фраза: «Получили навыки в редактировании HEX файлов. Мы молодцы =)»
Как преподаватели, мы можем совершенно ответственно засвидетельствовать, что это сущая правда – они, действительно, молодцы. Однажды пришли на консультацию с вопросом, что они, де, ничего не знают и ничего не понимают. Если коротко, то смысл ответа был примерно таков: у вас достаточно знаний и умений, идите, думайте и делайте лабораторную работу. Эти студенты блестяще справились с поставленной задачей. Именно поэтому мы посчитали возможным в качестве примера полностью включить их отчёт в настоящее пособие. Далее идёт отчёт студентов.
Ход работы:
1.Создание нового проекта.
Запускаем IAR и создаем новый проект:
1) Опция Project -> Create New Project. Выбираем C -> main. Сохраняем файл проекта,
указывая имя.
2) В открывшемся окне main.c объявляем внешнюю функцию на языке Assembler: extern int func_asm(void);
3) В саму функцию main добавляем код для исполнения внешней объявленной функции:
Рисунок 36 Функция main
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5 |
69 |
2. Создание файла исходного кода функции (скелета) на языке Assembler и включение его в проект.
Создадим объявленную функцию и добавим ее в проект:
1) Создадим скелет функции на языке Assembler: Опция File -> New -> File. Откроется пустое окно. Записываем в него скелет функции:
Рисунок 37 - Скелет функции на языке Assembler
Сохраняем ее: Правая Кнопка Мыши (ПКМ) по имени окна -> Save …-> ->Имя_Функции.asm.
2)Добавляем созданную функцию к нашему проекту: ПКМ по проекту -> Add -> Add Files -> Имя созданной функции
3)В опциях проекта меняем архитектуру:
ПКМ по проекту -> Options -> General Options -> Target -> Device выбираем Milandr 1986BE9x.
4)Запускаем проект в режиме Отладки(Debugging) – Кнопка Download and Debug, - и убеждаемся, что компилятор не выдал ошибок, и открылось окно Dissassembly.
3.Изменение настроек проекта для формирования загрузочного кода программы в Intel-HEX формате.
1)Закрываем режим отладки – Кнопка Stop Debugging. Меняем опции проекта для создания Hex файла:
ПКМ по проекту -> Options -> C/C++Compiler -> Optimizations -> Level ставим None. …Options -> Output Converter -> Output -> ставим галочку Generate additional output, Output format выбираем Intel Extended и ставим галочку Override default.
2)Изменяем Debug на Release. Запускаем проект в режиме отладки. HEX файл создастся в папке проекта: …\Debug\Exe\Имя_проекта.hex
Файл открывается блокнотом.
4.Написание исходного ассемблерного файла.
В данной работе в качестве объекта исследования выступали две ассемблерные
команды PUSH и POP. В ходе работы нам необходимо изучить битовые поля этих инструкций.
Синтаксис
PUSH{cond} reglist POP{cond} reglist где:
cond - необязательный код условия.
reglist - заключенный в фигурные скобки список из одного или нескольких регистров, которые должны быть записаны или считаны. В списке можно указывать диапазон номеров регистров. Начальный и конечный регистр диапазона разделены знаком "-". Элементы списка
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5 |
70 |
(отдельные регистры или диапазоны) разделяются запятыми.
Команды PUSH и POP являются синонимами команд STMDB и LDM (LDMIA) в которых базовый адрес памяти содержится в регистре указателя стека SP, а режим записи обратной записи значения базового регистра включен.
Мнемокоды PUSH и POP являются предпочтительными вариантами записи.
Описание
PUSH - сохраняет регистры в стеке в порядке уменьшения номеров регистров, при этом регистр с большим номером сохраняется в память с большим значением адреса.
POP - восстанавливает значения регистров из стека в порядке увеличения номеров регистров, при этом регистр с меньшим номеров считывается из памяти с меньшим значением адресом.
Ограничения
В данных инструкциях:
•список регистров reglist не должен содержать указатель стека SP;
•в инструкции PUSH список регистров не должен содержать счетчик команд PC;
•в инструкции POP список регистров не должен одновременно содержать регистры PC и LR.
В случае, если инструкция POP содержит в списке reglist счетчик команд PC:
•бит [0] загружаемого значения должен быть равен 1, передача управления при этом осуществляется по выровненному по границе полуслова адресу;
•если инструкция является условной, то она должна быть последней инструкцией в IT-блоке.
Инструкции PUSH и POP могут быть выражены через инструкции LDM и STM. Напишем код исходной функции на языке ассемблер, для изучения заданных
инструкций:
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |
Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5 |
71 |
Рисунок 38 Исходник функции на языке ассемблер
В процессе работы мы будем изменять код этой функции, меняя операнды команд для изучения битовых полей.
5. Изучение формата hex-файла.
Файл HEX – это текстовый файл, содержащий в символьном виде машинный код программы.
Файл состоит из текстовых ASCII строк. Каждая строка представляет собой одну запись. Каждая запись начинается с двоеточия (:), после которого идет набор шестнадцатеричных цифр кратных байту:
Начало записи (:).
Количество байт данных, содержащихся в этой записи. Занимает один байт (две шестнадцатеричных цифры), что соответствует 0…255 в десятичной системе.
Начальный адрес блока записываемых данных — 2 байта. Этот адрес определяет абсолютное местоположение данных этой записи в двоичном файле.
Один байт, обозначающий тип записи. Определены следующие типы записей:
ТУСУР, "Миландр" |
Каф. ЭСАУ |
Недяк С.П., Шаропин Ю.Б |
Февраль 2017 г. |