Материал: 6798

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5

67

5Исследование битовых полей машинного кода с помощью дизассемблера.

Лабораторная работа № 4

Цель. Изучить структуру и алгоритм формирования hex-файлов, получить навыки редактирования таких файлов.

5.1Введение

Внастоящей лабораторной работе мы продолжим знакомиться с ассемблером. Как мы уже говорили ассемблер – это специфический язык. Программирование на нём осуществляется почти на уровне железа, на уровне архитектуры ядра микроконтроллера. Следовательно, сколько архитектур, столько и ассемблеров. К ассемблеру мало подходит слово «изучить», к нему больше подходит слово «выучить» как, например, таблицу умножения. Если в таблице умножения требуется запомнить значения сомножителей и результат перемножения, то в случае ассемблера требуется запомнить мнемонику команды и результат её элементарного воздействия на состояние микроконтроллера. В руководствах по семейству микроконтроллеров система команд записывается в виде таблицы, где кратко поясняется назначение каждой команды. Если чуть прищуриться;-) то она будет очень похожа на таблицу умножения.

Несмотря на достаточно большое разнообразие систем команд, есть в них общая черта

–это структура команды, она у всех одинакова. Каждая ассемблерная команда состоит из двух основных частей: символьного кода операции (КОП, англ. COP) и символьного кода операндов. А машинный код, соответственно, состоит из двух битовых полей: поля кода операции и поля кода операндов, рисунок 35.

Рисунок 35. Формат листинга

Если в символьном коде мы можем легко различить две составные части команды, то в машинном коде всё несколько сложнее. Тема этой лабораторной работы в основном и посвящена исследованию структуры машинного кода.

В профессиональной жизни встречаются случаи, когда приходится модифицировать уже работающую программу сторонних разработчиков с целью некоторого изменения её параметров. Сейчас мы научимся это делать, образно говоря, мы научимся разговаривать с микропроцессором на его родном машинном языке.

Ниже на стр. 72 (Рис. 39) изображена машинная программа для микроконтроллера. Она записана в формате машинного кода. Это почти «фотография» памяти контроллера после его программирования. Такие программы на профессиональном жаргоне называют «прошивкой», а процесс программирования «заливкой» программы.

Программирование происходит путём передачи в контроллер с помощью специальных

ТУСУР, "Миландр"

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Февраль 2017 г.

Часть I. Процессор Cortex-M3. Программирование на ассемблере - 5

68

устройств пакетов данных. Каждый пакет данных имеет свою структуру. Строка в hex-файле как раз и представляет из себя такой пакет данных. Чтобы её отредактировать, нужно обязательно соблюдать правила формирования этой строки. А ещё нужно знать смысл отдельных фрагментов машинного кода. Выполняя эту лабораторную работу, можно почувствовать, насколько был труден хлеб первых программистов. Страшно представить, как можно было написать и отладить большую программу в машинных кодах.

5.2Содержание работы

1.Получить у преподавателя ассемблерную команду для исследования.

2.Создать новый проект.

3.Создать файл исходного кода функции (скелета) на языке Assembler и включить его в проект.

4.Изменить настройки проекта (options) таким образом, чтобы сформировался загрузочный код вашей программы в Intel-HEX формате.

5.Написать исходный ассемблерный файл так, чтобы его машинный код легко находился в сформированном hex-файле в обычном текстовом редакторе.

6.Изучить формат hex-файла. Отметить различия в представлении машинного кода в дизассемблере и hex-файле.

7.Последовательно меняя операнды заданной команды, исследовать назначение битовых полей машинного кода этой команды.

Техника анализа битовых полей машинного кода хорошо описана в отчёте студентов 539гр. Бушуевой Анастасии Олеговны и Климова Владимира Сергеевича. В конце отчёта есть шутливая фраза: «Получили навыки в редактировании HEX файлов. Мы молодцы =)»

Как преподаватели, мы можем совершенно ответственно засвидетельствовать, что это сущая правда – они, действительно, молодцы. Однажды пришли на консультацию с вопросом, что они, де, ничего не знают и ничего не понимают. Если коротко, то смысл ответа был примерно таков: у вас достаточно знаний и умений, идите, думайте и делайте лабораторную работу. Эти студенты блестяще справились с поставленной задачей. Именно поэтому мы посчитали возможным в качестве примера полностью включить их отчёт в настоящее пособие. Далее идёт отчёт студентов.

5.3Выполнение работы

Ход работы:

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 г.

Источник: https://studfile.net/preview/16438538/