71230

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

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

Коммуникация, связь, радиоэлектроника и цифровые приборы

Например запись команды UBFX R1 R0 0 1 в дизассемблере будет выглядеть следующим образом 0100 а hexфайле 0001 Исследование назначения битовых полей машинного кода заданной команды. Задана команда UBFX. Возьмем для примера команду UBFX продублируем ее с разным размером извлекаемого...

Русский

2014-11-03

110.46 KB

0 чел.

Министерство образования и науки Российской Федерации

Томский Государственный Университет Систем Управления и Радиоэлектроники (ТУСУР)

Кафедра электронных средств автоматизации и управления

(ЭСАУ)

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

по дисциплине «Микропроцессорные средства систем автоматизации и управления»

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

                   Выполнила:

студентка гр. 530

      ________ Яровикова Е.А.

“__”______________2013г

                                    Принял:

ассистент каф. ЭСАУ                        _________ Недяк С.П.

                                  “__”___________2013г  

2013

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

 Ход работы:

  1.  Создание нового проекта.

Запускаем IAR и создаем новый проект:

1)  Опция Project -> Create New Project. Выбираем C -> main. Сохраняем файл проекта, указывая имя.

2)  В открывшемся окне main.c объявляем внешнюю функцию на языке Assembler:

extern int func_asm(void);

3) В саму функцию main добавляем код для исполнения внешней объявленной функции:

 

Рисунок 1.1 Функция main

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

Создадим объявленную функцию и добавим ее в проект:

  1. Создадим скелет функции на языке Assembler: Опция File -> New -> File. Откроется пустое окно. Записываем в него скелет функции:

Рисунок 2.1 Скелет функции на языке Assembler

Сохраняем ее: Правая Кнопка Мыши (ПКМ) по имени окна -> Save …->

->Имя_Функции.asm

2) Добавляем созданную функцию к нашему проекту:

ПКМ по проекту -> Add -> Add Files -> Имя созданной функции

3) В опциях проекта меняем архитектуру:

ПКМ по проекту -> Options -> General Options -> Target -> Device выбираем Milandr 1986BE9x.

4)  Запускаем проект в режиме Отладки(Debugging) – Кнопка Download  and  Debug, - и убеждаемся, что компилятор не выдал ошибок, и открылось окно Dissassembly.

  1.  Изменение настроек проекта для формирования загрузочного кода программы в  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 

Файл открывается блокнотом.

  1.  Написание исходного ассемблерного файла.

В данной работе в качестве объекта исследования выступала ассемблерная команда UMLAL. В ходе работы необходимо изучить битовые поля этой инструкции.

Команда UMLAL используется как, беззнаковое длинное умножение со сложением.

Синтаксис команды:

UMLAL{cond} <RdLo>, <RdHi>, <Rn>, <Rm>

Где:

cond – необязательный суффикс условия

RdLo, RdHi – регистры – приёмники. В них хранится значение, прибавляемое к произведению.

 Rn, Rm– регистры, содержащие перемножаемые значения.

Описание:

Команда UMLAL интерпретирует содержимое регистров Rn и Rm как целые числа без знака. Команда перемножает эти числа, прибавляет к 64-битному произведению 64-битное число, находящееся в регистрах RdHi и RdLo, и заносит результат обратно в регистры RdHi и RdLo.

Ограничения:

  1. Нельзя использовать  SP либо  PC [3]
  2.   RdHi и RdLo должны быть разными регистрами [3]

Напишем код исходной функции на языке ассемблер, для изучения заданных инструкций:

  1.  Изучение формата  hex-файла.  

Файл HEX – это текстовый файл, содержащий в символьном виде машинный код программы.

Файл состоит из текстовых ASCII строк. Каждая строка представляет собой одну запись. Каждая запись начинается с двоеточия (:), после которого идет набор шестнадцатеричных цифр кратных байту:

  1.  Начало записи (:).
  2.  Количество байт данных, содержащихся в этой записи. Занимает один байт (две шестнадцатеричных цифры), что соответствует 0…255 в десятичной системе.
  3.  Начальный адрес блока записываемых данных — 2 байта. Этот адрес определяет абсолютное местоположение данных этой записи в двоичном файле.
  4.  Один байт, обозначающий тип записи. Определены следующие типы записей:

0 — запись содержит данные двоичного файла.

1 — запись обозначает конец файла, данных не содержит. Имеет характерный вид «:00000001FF».

2 — запись содержит начальный адрес сегмента памяти.

4 — запись расширенного адреса.

  1.  Байты данных, которые требуется сохранить в EPROM (их число указывается в начале записи, от 0 до 255 байт).
  2.  Последний байт в записи является контрольной суммой. Рассчитывается так чтобы сумма всех байтов в записи была равна 0.
  3.  Строка заканчивается стандартной парой CR/LF (0Dh 0Ah).

После успешной сборки проекта был сгенерирован 16-тиричный файл LABA2.hex:

:100000000004002009010000E7000000E7000000F4

:10001000E7000000E7000000E7000000000000002B

:10002000000000000000000000000000E7000000E9

:10003000E700000000000000E7000000E70000000B

:10004000FF20C0F30001C0F30101C0F30201C0F3BF

:100050000301C0F30401C0F30501C0F30601C0F3BE

:100060000701C0F30702C0F30703C0F30704C0F39E

:100070000705C0F30706C0F30707C0F30708C0F37E

:100080000709C0F3070AC0F3070BC0F3070CC1F35D

:100090000000C2F30000C3F30000C4F30000C5F386

:1000A0000000C6F30000C7F30000C8F30000C9F366

:1000B0000000CAF30000CBF30000CCF3000070474F

:1000C00000F009F8002801D0C046C046002000F02A

:1000D00004F800F006F80120704780B5FFF7B0FF84

:1000E000FCE700F001B8FEE70746384600F002F8EA

:1000F000FBE7000080B5C046C046024A1100182048

:10010000ABBEFBE726000200C046C046C046C04664

:04011000FFF7D6FF20

:0400000500000109ED

:00000001FF

Рассмотрим структуру одной из записей получившегося hex-файла:

:10004000FF20C0F30001C0F30001C0F30101C0F3C1

: - начало записи;

10 -  количество байт данных (16 байт);

0040 - адрес памяти, куда будет помещена запись;

00 - тип записи — данные;

FF20C0F30001C0F30001C0F30101C0F3 – данные;

C1– контрольная сумма;

Контрольная сумма вычисляется как дополнение по модулю 256 до нуля суммы по модулю 256 всех байт. Т.е. нужно последовательно сложить все байты, так, чтобы результат каждого сложения занимал также один байт, при этом переполнение не учитывается и просто отбрасывается, - это и будет операция сложения по модулю 256. Далее нужно от 256 отнять полученный байт или можно сделать инверсию полученного байта и увеличить результат на 1 – это будет вычисление дополнения по модулю 256 до 0.  В результате получается, что сумма по модулю 256 всех байт вместе с контрольной суммой дает ноль. Так проверяется целостность и безошибочность записи при считывании.

Посчитаем контрольную сумму для разобранной ранее записи hex-файла и сравним правильность наших расчетов.

Складываем все байты по модулю 256:

10+40+FF+20+C0+F3+00+01+C0+F3+00+01+C0+F3+01+01+C0+F3

Инвертируем полученный результат: not(83F) = C0;

Прибавляем 1: C0+1=C1

Мы видим, что полученная контрольная сумма совпадает с той, которая была сформирована в hex-файле, значит можно сделать вывод, что подсчёт произведён верно. Если сравнить hex-файл с кодом сформированным дизассемблером, то мы видим, что представление порядка байтов немного разное. В hex-файле сначала идет младший байт, затем старший, а в дизассемблере наоборот, сначала старший, потом младший. Например, запись команды UBFX R1, R0, #0, #1 в дизассемблере будет выглядеть следующим образом 0100, а hex-файле 0001

  1.  Исследование назначения битовых полей машинного кода заданной команды.

Задана команда UBFX. Необходимо исследовать битовые поля этой команды, меняя операнды.

Разберемся в логике построения команды в битовом поле. Возьмем для примера команду UBFX, продублируем ее с разным размером извлекаемого битового поля, разными регистрами, номером  бита начиная с которого извлекается битовое поле. (рис. 6.1).

Рисунок 6.1. Отображение команды в Disassembly

Обратив внимание на изменение байтов 0x42, 0x46, 0x4a, 0x4e, 0x52 и т.д..

UBFX R1, R0, #0, #1

0x42: 0xf3c0  0x0100  UBFX        R1,       R0,      #0,       #1

UBFX R1, R0, #0, #2

0x46: 0xf3c0  0x0101  UBFX        R1,       R0,      #0,       #2

UBFX R1, R0, #0, #3

0x4a: 0xf3c0  0x0102  UBFX        R1,       R0,      #0,       #3

UBFX R1, R0, #0, #4

0x4e: 0xf3c0  0x0103  UBFX        R1,       R0,      #0,       #4

UBFX R1, R0, #0, #5

0x52: 0xf3c0  0x0104  UBFX        R1,       R0,      #0,       #5

UBFX R1, R0, #0, #6

0x56: 0xf3c0  0x0105  UBFX        R1,       R0,      #0,       #6

UBFX R1, R0, #0, #7

0x5a: 0xf3c0  0x0106  UBFX        R1,       R0,      #0,       #7

UBFX R1, R0, #0, #8

0x5e: 0xf3c0  0x0107  UBFX        R1,       R0,      #0,       #8

UBFX R2, R0, #0, #8

0x62: 0xf3c0  0x0207  UBFX        R2,       R0,      #0,       #8

UBFX R3, R0, #0, #8

0x66: 0xf3c0  0x0307  UBFX        R3,       R0,      #0,       #8

UBFX R4, R0, #0, #8

0x6a: 0xf3c0  0x0407  UBFX        R4,       R0,      #0,       #8

UBFX R5, R0, #0, #8

0x6e: 0xf3c0  0x0507  UBFX        R5,       R0,      #0,       #8

UBFX R6, R0, #0, #8

0x72: 0xf3c0  0x0607  UBFX        R6,       R0,      #0,       #8

UBFX R7, R0, #0, #8

0x76: 0xf3c0  0x0707  UBFX        R7,       R0,      #0,       #8

UBFX R8, R0, #0, #8

0x7a: 0xf3c0  0x0807  UBFX        R8,       R0,      #0,       #8

UBFX R9, R0, #0, #8

0x7e: 0xf3c0  0x0907  UBFX        R9,       R0,      #0,       #8

UBFX R10, R0, #0, #8

0x82: 0xf3c0  0x0a07  UBFX        R10,       R0,      #0,       #8

UBFX R11, R0, #0, #8

0x86: 0xf3c0  0x0b07  UBFX        R11,       R0,      #0,       #8

UBFX R12, R0, #0, #8

0x8a: 0xf3c0  0x0c07  UBFX        R12,       R0,      #0,       #8

UBFX R0, R1, #0, #1

0x8e: 0xf3c1  0x0000  UBFX        R0,       R1,      #0,       #1

UBFX R0, R2, #0, #1

0x92: 0xf3c2  0x0000  UBFX        R0,       R2,      #0,       #1

UBFX R0, R3, #0, #1

0x92: 0xf3c3  0x0000  UBFX        R0,       R3,      #0,       #1

……………………………………………………………….

……………………………………………………………….

UBFX R0, R10, #0, #1

0xb2: 0xf3ca  0x0000  UBFX        R0,       R10,      #0,       #1

UBFX R0, R11, #0, #1

0xb6: 0xf3cb  0x0000  UBFX        R0,       R11,      #0,       #1

UBFX R0, R12, #0, #1

0xba: 0xf3cc  0x0000  UBFX        R0,       R12,      #0,       #1

UBFX R0, R12, #1, #1

0xbe: 0xf3cc  0x0040  UBFX        R0,       R12,      #1,       #1

UBFX R0, R12, #2, #1

0xc2: 0xf3cc  0x0080  UBFX        R0,       R12,      #2,       #1

UBFX R0, R12, #3, #1

0xc6: 0xf3cc  0x00c0  UBFX        R0,       R12,      #3,       #1

UBFX R0, R12, #4, #1

0xca: 0xf3cc  0x1000  UBFX        R0,       R12,      #4,       #1

UBFX R0, R12, #5, #1

0xce: 0xf3cc  0x1040  UBFX        R0,       R12,      #5,       #1

UBFX R0, R12, #6, #1

0xd2: 0xf3cc  0x1080  UBFX        R0,       R12,      #6,       #1

UBFX R0, R12, #7, #1

0xd6: 0xf3cc  0x10c0  UBFX        R0,       R12,      #7,       #1

Была замечена определенная закономерность:

  1.  Адреса, изменяются каждый раз на 4, 0x42, 0x46, 0x4a, 0x4e, 0x52 и т.д.
  2.  Везде неизменно присутствует  f3c- биты самой команды UBFX
  3. Сразу после которых следуют бит регистра Rn

0xf3c1 для регистра  R1    

0xf3c2 для регистра  R2

0xf3c3 для регистра  R3

и т.д.

С повышением регистра на 1наблюдается увеличение бита.

  1.  Далее была замечена странность старший бит старшего байта и старший бит младшего байта изменялись при изменении номера бита начиная с которого извлекается битовое поле

0x0000  #0,       

0x0040  #1

0x0080  #2

0x00c0  #3

0x1000  #4

0x1040  #5

0x1080  #6

0x10c0  #7

Проследим логику изменения

0x0000 есть 0000 0000 0000 0000 в двоичной системе

0x0040 есть 0000 0000 0100 0000 в двоичной системе

0x0080 есть 0000 0000 1000 0000 в двоичной системе

0x00с0 есть 0000 0000 1100 0000 в двоичной системе

0x1000 есть 0001 0000 0000 0000 в двоичной системе

0x1040 есть 0001 0000 0100 0000 в двоичной системе

0x1080 есть 0001 0000 1000 0000 в двоичной системе

0x10с0 есть 0001 0000 1100 0000 в двоичной системе

Можно заметить порядок изменения единичек в двоичном коде.

  1. Младший бит старшего байта   регистра Rd

0x0207 для  R2

0x0307 для  R3

0x0407 для R4

0x0507 для R5

0x0607 для R6

0x0707 для R7

0x0807 для R8

0x0907 для R9

0x0a07 для R10

0x0b07 для R11

0x0c07 для R12

С повышением регистра на 1наблюдается увеличение бита.

  1.  Младший бит младшего байта отвечает за размер извлекаемого битового поля.

0x0100 для  #1

0x0101 для  #2

0x0102 для  #3

0x0103 для  #4

0x0104 для  #5

0x0105 для  #6

0x0106 для  #7

0x0107 для  #8

С увеличение размера извлекаемого поля наблюдается увеличение бита.

Редактирование одной из строк hex-файла.

Попробуем отредактировать одну из строк hex-файле.Исходная строка: :10004000FF20C0F30001C0F30001C0F30101C0F3C1

0001 соответствует регистру R1(Rd), #0(#lsd), #1(#width), поменяем это значение на 4102, что соответствует R2(Rd), #1(#lsd), #2(#width). Пересчитаем контрольную сумму: 7F.

Сохраним изменения в hex-файле.

Заключение

В ходе лабораторной работы была изученна структура и алгоритм формирования hex-файлов,  были получены навыки редактирования hex-файлов. Был изучен синтаксис команды UBFX. Было проведено исследование назначения битовых полей машинного кода для данной команды.

Используемая литература:

  1.  Ю.Джозеф/ Ядро CortexM3 компании ARM. Полное руководство / пер. с

анrл. А. В. Евстифеева.  М. : ДодэкаХХI

  1.  Ю.Б. Шаропин,С.П. Недяк /Лабораторный практикум по микроконтроллерам семейства Cortex-M/Методическое пособие по проведению работ/2013/77с

  1.  ARM Информационный центр. [Электронный  ресурс] режим доступа: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Cjahjhee.html


 

А также другие работы, которые могут Вас заинтересовать

28150. «Методика преподавания психологии»: чему и как учить 40.5 KB
  Добиться реализации данной цели на лекционных занятиях невозможно курс должен быть лекционносеминарским где на практических занятиях студенты могли бы рассматривать прикладные вопросы практики обучения связанные с сохранением психического здоровья учащихся с созданием благоприятного психологического климата на уроке с возможностями объективного оценивания эффективности образовательного процесса. Однако не учитывая изменения эмоционального состояния ребенка динамику состояния соматического здоровья нельзя судить о качестве учебного...
28151. Проблема психической нормы и патологии 44 KB
  Вопрос определения нормы и патологии является крайне сложным и затрагивает различные сферы человеческой деятельности от медицины и психологии до философии и социологии. Был совершён ряд попыток вывести критерии психической нормы в число которых включали соответствующую возрасту человека зрелость чувств адекватное восприятие действительности наличие гармонии между восприятием явлений и эмоциональным отношением к ним умение уживаться с собой и социальным окружением гибкость поведения критический подход к обстоятельствам жизни наличие...
28152. Периодизация интеллектуального развития ребёнка (по Ж.Пиаже) 33.21 KB
  Швейцарский теоретиккогнитивист Жан Пиаже 1896-1980 был пионером в этой области исследований. С точки зрения Пиаже интеллект не просто реагирует на раздражители: скорее он растет меняется и адаптируется к миру. Пиаже и других когнитивных психологов называют структуралистами поскольку их интересует структура мышления и то каким образом интеллект перерабатывает информацию. Напротив когнитивные структуры Пиаже являются абстрактными и гипотетическими.
28153. Теоретические и психотерапевтические концепции Роджерса и Франкла 63 KB
  Этот мир создаваемый человеком может совпадать или не совпадать с реальной действительностью так как не все предметы в окружении человека осознаются им. Говоря о структуре Я Роджерс пришел к выводу о том что внутренняя сущность человека его Самость выражается в самооценке которая является отражением истинной сути данной личности его Я. Исследования проведенные Роджерсом доказывали что успешная социализация человека его удовлетворение работой и собой коррелируют с Уровнем его самосознания. При этом Роджерс не только говорит о...
28154. История развития представлений на природу способностей 58.5 KB
  История развития представлений на природу способностей Само понятие способности ввел в науку Платон. Источник развития способностей помещается внутрь человека они обусловлены наследственным генетическим фактором. К теориям преформизма примыкают и воззрения испанского врача Хуана Уарте Исследование способностей к наукам 1575 год. Уарте также говорил о врожденности способностей: Пусть плотник не занимается земледелием а ткач архитектурой; пусть юрист не занимается лечением а медик адвокатским делом; но пусть каждый занимается только...
28155. Процесс психологического консультирования. Принципы, структура, техники 114.5 KB
  Цель консультирования помочь клиентам понять происходящее в их жизненном пространстве и осмысленно достичь поставленной цели на основе осознанного выбора при разрешении проблем эмоционального и межличностного характера . В консультировании акцентируется ответственность клиента т. признается что независимый ответственный индивид способен в соответствующих обстоятельствах принимать самостоятельные решения а консультант создает условия которые поощряют волевое поведение клиента. СТРУКТУРА ПРОЦЕССА КОНСУЛЬТИРОВАНИЯ Ни одна из...
28156. Проблема психологического «выгорания», копинг-стратегии 64.5 KB
  Проблема психологического выгорания копингстратегии. Совладающее поведение копингстратегии. Проблема копинга совладания личности с трудными жизненными ситуациями возникла в психологии во второй половине ХХ века. В настоящее время будучи свободно употребляемым в различных работах понятие копинг охватывает широкий спектр человеческой активности от бессознательных психологических защит до целенаправленного преодоления кризисных ситуаций.
28158. Психологические признаки трудовой деятельности 28 KB
  Климов выделяет четыре психологических признака трудовой деятельности: Сознательное предвосхищение социально ценного результата. Таким образом установим некоторую структуру рассматриваемого первого признака труда и будем различать в нем три компонента которые примем как относительно самостоятельные: а более или менее ясное знание о продукте деятельности б более или менее четкое осознание его социальной ценности в более или менее выраженный аффективный тон соответствующих знаний представлений образов. Деятельность становится трудом...