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


 

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

65621. ЗАСТОСУВАННЯ ЧАСТОТНО-ЧАСОВИХ МЕТОДІВ ДО ОБРОБКИ НЕСТАЦІОНАРНИХ СИГНАЛІВ В РЕАЛЬНОМУ МАСШТАБІ ЧАСУ 5.84 MB
  Робота всіх радіотехнічних пристроїв супроводжується динамічними спотвореннями при обробці сигналів з маніпуляцією параметрів або з безперервною зміною цих параметрів. Дослідженню і розробленню методів аналізу динамічних режимів кіл та перетворень нестаціонарних сигналів в динамічних колах присвячено багато робіт.
65622. ПОВІСТІ Й РОМАНИ І. С. НЕЧУЯ-ЛЕВИЦЬКОГО: АРХЕТИПНИЙ АНАЛІЗ 149 KB
  Цей аспект його творчості довго замовчувався дослідниками. Об’єктивний аналіз написаного митцем засвідчує, що його українська сутність виявляється не лише на ідеологічному рівні, а й виринає із глибин підсвідомості. Через те він немовби зсередини бачив історію України, долю українців, душу українця.
65623. ЕКОЛОГІЧНІ ОСОБЛИВОСТІ ЛІХЕНОІНДИКАЦІЇ АНТРОПОГЕННО ТРАНСФОРМОВАНОГО СЕРЕДОВИЩА НА ПІВДЕННОМУ СХОДІ УКРАЇНИ 297 KB
  На відміну від центральних регіонів країни на південному сході України вивченість можливості ліхеноіндикації не була реалізована повною мірою. Оскільки біоіндикаційні властивості можуть бути обмежені екологічними факторами навколишнього середовища вплив яких викликає у індикаторного...
65624. ВПЛИВ НЕСТАБІЛЬНОСТІ ХАРАКТЕРИСТИК ШИН НА НЕРІВНОМІРНІСТЬ ЇХНЬОГО НАВАНТАЖУВАННЯ І СТІЙКІСТЬ РУХУ АВТОМОБІЛІВ 397 KB
  Традиційні способи комплектації шин (у тому числі і здвоєних) не забезпечують необхідної довговічності під час експлуатації. На складених колесах зі здвоєними шинами утворюються потоки паразитної потужності, що циркулює у замкненому контурі й спричинює додаткові втрати на тертя між рушієм і дорогою.
65625. ФОРМУВАННЯ ПРОГНОСТИЧНИХ УМІНЬ МАЙБУТНІХ МЕНЕДЖЕРІВ У ВИЩИХ АГРАРНИХ НАВЧАЛЬНИХ ЗАКЛАДАХ 309 KB
  У реалізації завдань гуманістичної трансформації менеджмент-освіти пріоритетна роль належить розвитку професійних умінь майбутніх управлінців. Одним із них є вміння правильно передбачати можливі напрями розвитку підприємства та розробляти його подальшу стратегію, що практично неможливо...
65626. ТЕХНОЛОГІЯ СОУСІВ З ДІЄТИЧНИМИ ДОБАВКАМИ ФУНКЦІОНАЛЬНОГО ПРИЗНАЧЕННЯ 9.48 MB
  Перспективним напрямом вирішення завдання щодо підвищення харчової цінності зниження дефіциту есенційних речовин є розроблення технології соусів функціонального призначення що передбачає поєднання традиційної сировини з дієтичними добавками.
65627. ПОТОКОВІ МОДЕЛІ ТА ДВОРІВНЕВІ МЕТОДИ УПРАВЛІННЯ ТРАФІКОМ В IP/MPLS-МЕРЕЖАХ З ПІДТРИМКОЮ ТЕХНОЛОГІЇ TRAFFIC ENGINEERING 577.5 KB
  Графові моделі пошуку найкоротшого шляху, що використовуються в сучасних протоколах маршрутизації, а також засновані переважно на адміністративному впливі механізми управління чергами мають досить обмежені можливості щодо врахування характеристик трафіка й вимог, що стосуються якості обслуговування та масштабованості.
65628. Інформаційне та технічне забезпечення екологічної безпеки критично небезпечних промислових об’єктів 397 KB
  На відміну від автоматичних установок пожежогасіння які розраховують виходячи з подачі обєму рідини на одиницю площі за відрізок часу в якості параметрів ефективності зменшення установкою екологічно шкідливого впливу аварії автором запропоновано розраховувати нову установку виходячи з відношення обєму розпорошеного...
65629. ЛЕКСИКА «ДИТЯЧОГО СПІЛКУВАННЯ» У ГОВІРКАХ ЦЕНТРАЛЬНОЇ СЛОБОЖАНЩИНИ (ХАРКІВЩИНИ) 145.5 KB
  Усі ці роботи різні тематикою матеріалом й аспектами вивчення поєднує одне: предметом дослідження в них є говірне мовлення дорослих. Територіальне ж дитяче мовлення на сьогодні залишається практично не дослідженим як у світовому так і у вітчизняному мовознавстві хоча теоретичне осмислення цього...