Дизассемблер прошивок микроконтроллеров 18 серии.

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

Расшифровка видео

0:01
Приветствую друзья мы много времени провели разбираясь с файлами прошивки для микроконтроллеров восемнадцатой
0:07
серии осталось теперь только научиться их деза самброс
0:13
самброс файла который понятен только компилятор ВМ который будет понятен нам
0:19
Зачем это надо например Вы прочитали память какого-нибудь устройства и хотите внести свои изменения или понять
0:25
алгоритм работы или ещё раньше в журналах Радио Вась различные устройства
0:31
на микроконтроллерах а файл прошивки в виде текста печатался в конце статьи чаще всего он был не работоспособный так
0:38
как его никто не проверял или допускались опечатки деза
0:45
самброс для своих программ в своё время я написал приложение для деза
0:52
самброс его в порядок и как обычно Если что-то сделал и не доделал то проще
0:57
заново сделать чем доделать Извините за тавтологию выполнена программа в виде
1:02
приложения МФЦ на основе
1:16
одноконная мой
1:21
вид визу studia сгенерировал шаблон со всеми необходимыми элементами управления
1:33
нене осталось только добавить дополнительную панель для управления мром и разделить окно на два
1:39
вида в первом будет отображаться загруженная прошивка а во втором деза
1:48
самброс кода задействован сгенерированный класс dis ism
1:53
pvw а для загружаемого
2:00
в качестве базового класса всё тот же Edit viw данный класс поддерживает
2:05
редактирование и набор текста непосредственно самой программе Если вы перепечатывание код с бумажного
2:12
носителя панель для дизассемблирование создаётся в классе отвечающей за работу
2:17
с основным окном здесь же добавляются в неё все необходимые элементы управления
2:23
такие как кнопка запускаю процесс десам брова подпись назначение выпадающего
2:29
списка и сам список выбора микроконтроллера для которого будет создаваться файл на этом месте
2:35
остановимся и разберём алгоритм поподробнее так как я старался сделать программу под всю линейку
2:41
микроконтроллеров восемнадцатой серии А их немало и заполнять список всеми возможными типами нецелесообразно я
2:48
решил выделить под них отдельную папку в которую можно скопировать нужные подключаемые файлы для конкретных
2:54
устройств из этой директории эта папка входит в состав компилятора mplab из
3:00
которой он получает сведения о текущем микроконтроллере Мы также будем использовать информацию из этих файлов
3:06
для деза самброс регистров специального
3:13
назначения а также флаги к
3:24
ним описание разделов памяти и конфигурации Можно конечно обойтись без
3:29
данной информации Но это затруднит навигацию в коде так как вместо привычных имён мы увидим их адреса что
3:36
затруднит чтение кода Если вы хотите включить список все поддерживаемые
3:41
микроконтроллеры то закомментировать
4:01
в конце функции загружается расположение элементов управления и выбранный ранее
4:09
микроконтроллер в этой функции производится разделение окна на две области и подключается класс для работы
4:15
с хкс файлом заодно здесь же загружаются ранее сохранённые размеры окна и положение разделителя
4:37
а при закрытии программы все эти параметры сохраняются в этой
4:45
функции или можно принудительно сохранить их через меню вид сохранить
4:50
состояние окна остальные функции не столь Важны и по комментариям легко
4:55
определить их назначение перейдём к классу работы
5:02
документом с помощью него очищаются виды обоих окон Когда нажимаем на кнопку
5:08
новый
5:13
документ открывается файл прошивки сохраняется ассамблей файл или
5:19
файл прошивки если он был изменён или набран сохранение того или иного
5:25
документа производится одной кнопкой А выбор зависит от активного вида то есть
5:31
на который обращен фокус ввода например фокус ввода обращён к ам файлу при
5:37
нажатии на кнопку сохранить появится диалоговое окно с соответствующим
5:43
расширением при переключении между видами Кнопка будет изменять своё состояние в зависимости от того
5:49
модифицирован документ или
5:56
нет при повторном сохранении Пусть заправа будет А сохранение произойдет в
6:02
ранее указанный файл Вот наши два файла с
6:09
соответствующими
6:20
данными если фокус ввода перед сохранением указывал не на тот документ
6:25
то вы можете просто изменить расширение фильтре программа идёт запись в указанный файл соответствующие
6:34
данные приложение автоматически отслеживает все изменения в документах Если вы попытаетесь закрыть создать или
6:41
открыть новый файл то программа выдаст запрос о сохранении изменений как во всех уважаемых программах подробно
6:48
разбирать работу функций открытия и сохранения документа не будем так как впереди ещё много работы Если Кому
6:55
интересно можете самостоятельно посмотреть их реализацию А если что-то понятно то Добро пожаловать в
7:01
комментарии класс ASM pvw предназначен для вывода ассамбле кода и не
7:08
представляет большого интереса так как в основном к нему идёт обращение из других классов в нём только производится
7:15
активация и переадресация кнопок сохранить и деза
7:23
самброс шрифта как и в классе xview для лучшей читаемости кода у ширино шрифта
7:30
все символы одной ширины Они разные благодаря чему строки не расползаются и
7:35
каждый аргумент находится на своём
7:42
месте самый насыщенной функциями класс hex viw он отвечает за отображение КС
7:48
файла а также производит все необходимые действия с кодом чтобы деза
7:54
самброс ранее в нём изменён шрифт на моноширинный следующие четыре функции не
8:00
представляют большого интереса по комментариям к ним легко понять их назначение основные действия начинаются
8:07
с этой функции которая вызывается при нажатии на кнопку Деди
8:15
ассамбле первым делом получаем указатель на основное окно через которое происходит связь с остальными классами и
8:22
элементами управления объявив и инициализировав необходимые переменные читаем код hex F
8:37
все расшифрованные данные будут записываться в переменные объявленные в отдельном классе класс состоит из набора
8:45
переменных массивов и функций для удобства работы с кодом первая переменная предназначена для записи
8:51
адреса каждой обработанной строки в дальнейшем Когда начнём расставлять метки переходов по ней Будем
8:57
ориентироваться в какое место нужно установить соответствующий лейбл сама запись адресов производится с помощью
9:04
этой функции где каждый новый адрес помещается в конец строки следующая переменная будет содержать только
9:10
фактические переходы которые будут записаны после соответствующих инструкции как раз по ним будут иска
9:17
необходимые метки из предыдущей строки ниже идут два массива первый предназначен для записи шапки программы
9:25
в которую будут входить подключаемый файл слово конфигурации и объявление регистров общего назначения второй
9:32
массив предназначен для формирования самого ам кода базы для него служит ещё
9:37
один вспомогательный класс в котором каждая часть строки кода будет помещена в соответствующую переменную строка
9:44
условно разделена на шесть полей первое поле предназначено подметки переходов и изначально заполняется тремя табуляция
9:52
если программа найдёт переход на эту строку то сюда запишется соответствующий йл второе поле предназначено инструкцию
10:00
в третье записывается имя регистра над которым производится действие а флаг
10:05
результата записывается в четвёртое ещё зарезервировано дополнительное пятое поле под атрибуты которые обычно никто
10:13
не использует Но в данном случае оно понадобится Так как через него будет определяться доступ к регистру Об этом я
10:19
расскажу чуть позже И последнее шестое поле предназначено под комментарий коду
10:25
в него будет записан адрес инструкции и её код чтобы можно было легко найти данный участок в хкс файле при
10:32
возникновении сомнения в интерпретации данных перед началом дизассемблирование
10:37
очистим все переменные в классах вызвав соответствующую функцию получив и
10:43
селектора тип микроконтроллера которому предназначен процесс удалим вторую с третьей буквы и добавим расширение чтобы
10:50
получилось название ИК файла А в дальнейшем к нему
10:56
путь Если вы решите использовать доступны микроконтроллеры то закомментировать
11:23
неточный найдя нужный ИК файл программа загружает его содержимое в строку
11:36
теперь Необходимо определить конец программной памяти по первой директиве Bet Ram которая указывает на начало
11:59
Чтобы вс было по красоте на определённых участках будут добавляться разделители из равно сначала в массив инициализации
12:08
записываем подключаемый файл по которому компилятор как и мы будет определять
12:13
имена и адреса используемых регистров специального назначения подготовившись к
12:18
записи конфигурации начнём заполнять массив деза самброс шапки основной
12:24
программой в цикле который завершится после выборки всех данных или кон кода
12:30
нанм по срочно извлекать записи которые начинаются с
12:37
двоеточия разбив строку на длину адрес Тип и данные определяем их тип всё в
12:44
точности что делали с прошивкой перед отправкой на устройство для самопрограммирования собрав адресы
12:51
старши и младших частей определяем назначение данных для пользовательского
12:56
ID слово конфигурации ипмм данные обрабатываются в соответствующих
13:01
функциях которые рассмотрим чуть позже а для фш надо произвести дополнительные
13:06
манипуляции так как тип указывает на смену раздела памяти записываем структуру файла на место инструкции
13:13
директиву org А на место регистра адрес с которого начнётся следующий код
13:19
добавив подготовленную структуру в массив ам кода уходим на новый
13:25
Круг выдерну следующую строчку и разбив е на по типу выбираем дальнейшие действия так
13:33
как тип равен нулю продолжаем работать с флеш памятью по ранее указанному адресу
13:39
в этом условии проверяем различие текущего адреса с ранее полученным пока
13:45
данные следуют друг за другом это условие не выполняется А если обнаружен разрыв то
13:52
записываем новое определение пространства памяти с которого продолжим записывать инструкции
14:00
в цикле for извлекаем из данных младшую и старшую части слова который вместе с
14:05
текущим адресом передаём функцию для расшифровки попав в эту функцию
14:14
инициализирует комментарий чтобы не заниматься этим в каждом условии Вот так
14:19
он будет выглядеть для текущей строки ам кода также подготовим и запишем условную
14:25
метку перехода для данной строки если одна из следующих инструкций укажет на
14:31
неё вторым параметром идёт индекс ячейки массива в которую будет записана строка
14:37
кода и в качестве разделителя между метками применяется вертикальная черта
14:43
когда займёмся расстановкой меток станет понятнее назначение данной процедуры теперь самое интересное почти все
14:50
инструкции состоят из одного слова или 16 бит в которые входят директива в
14:56
зависимости от её назначения Константа метка перехода или регистр которому
15:01
направлено действие флаг результата или бит и атрибут доступа для велений
15:08
записывается знак навигации по коду есть ещё четыре инструкции состоящие из двух
15:13
слов или 32 бит к ним относится безусловный переход go to который может
15:19
Дотянуться до любого участка программной памяти как и вызов ка инструкция прямого
15:24
копирования из регистра в регистр F ФСР указывающая адрес регистра к
15:32
которому пойдёт обращение через косвенную адресацию все типы инструкции и назначение бит приведены в этой
15:42
таблице код директивы может занимать от 4 до 16 бит расположенных в старшей
15:48
части Слова вот эти шестнадцати битные инструкции не взаимодействуют ни с
15:54
какими регистрами за исключением некоторых которые косвенно влияют на
15:59
например сброс рожевого таймера запись или выталкивания адреса из тека
16:05
десятичная коррекция значения в регистре врек Или те которые работают с таблицами
16:10
так как этим инструкциям не с чем взаимодействовать то их намного проще деза
16:16
самброс части слова вычислить ноль а по младшей само
16:22
действие записав директиву структуру ам файла покидаем функцию
16:31
инструкции и rfe имеют атрибут который по умолчанию равен нулю обозначающий
16:37
быстрый выход или вход для вызова кал этот флаг в основном используется
16:42
компилятором c+ Plus чтобы при входе вызываемый программу сохранить значение аккумулятора и статуса в теневых
16:49
регистрах а при выходе их восстановить следом идут инструкции
16:55
взаимодействующие с регистром и флагом результата кото указывает место сохранения а также атрибут управляющий
17:03
доступом вычисление директивы производится по старшему слову но так как два младших бита флаг и атрибут
17:11
могут иметь различные значения то в селектор добавлены дополнительные константы перекрывающие комбинации этих
17:18
бит на примере сложение значения аккумулятора и регистра рассмотрим
17:24
упаковку аргументов которая идентична для всей этой группы старши бит
17:29
определяют тип инструкции Первый БИТ – флаг результата сохранения если он
17:34
очищен то результат остаётся в регистре А если установлен то отправляется в аккумулятор в ассамбле коде он
17:42
записывается как F или W нулевой бит управляет доступом для регистров общего
17:48
назначения gpr адрес которых находится в диапазоне от нуля до 5F этот бит очищен
17:55
А когда адрес больше этого значения то может произойти конфликт с регистрами специального назначения сфр младшая
18:02
часть адреса которых тоже начинается с 60h и заканчивается на FF чтобы это
18:08
предотвратить атрибут принимает значение бант банк при обращении к регистрам gpr
18:15
Чей адрес больше значений 5F во всех остальных случаях он будет очищен приняв
18:20
значение по умолчанию АС прямой доступ Его не обязательно указывать
18:26
соответственно младшая часть адреса регистра к которому идёт обращение расположено в младшей части слова это
18:33
действие справедливо для всех инструкций которые имеют данный атрибут вот таким
18:38
способом разработчики упаковали инструкцию регистр флаг и атрибут в одно
18:44
16 битное слово работа с константами немного проще старшую часть слова занимает
18:52
директива а младшую сама Константа инструкцию выбора банка Также можно сюда
18:57
отнести единственное различие в четырёх битной константе которая выбирает банк
19:03
от нулевого до пятнадцатого записав всё по своим местам
19:08
покидаем
19:13
функцию теперь разберём упаковку бит в инструкциях ветле ней и коротких переходов которые укладываются также в
19:21
одно слово короткие переходы По условию состоят из выделенных восьми бит под
19:27
директиву одного би бита под знак и оставшиеся 7 бит неверно не под метку а
19:33
ими указывается количество строк которые надо пропустить при движении вниз по
19:38
коду флаг знака очищен значение записанное в младшую часть слова умножается на два так как каждая
19:45
инструкция занимает два байта и складывается с текущим адресом тем самым
19:50
получаем метку куда перейдёт Рабочая точка программы Аналогично если седьмой
19:56
бит установлен то вместо сложения вычитаем семи битное значение умноженное
20:01
на два из текущего адреса перемещаясь вверх по коду для короткого перехода без
20:07
условия или аналогичного вызова кроме длины младшего аргумента ничего больше
20:12
не меняется если для предыдущих вет лений диапазон перехода составлял плюс-минус 127 слов то для этих
20:20
инструкций он Составляет плюс-минус 1023 слова
20:35
немного сложнее обстоять дела с длинным переходом и вызовом которые состоят из двух слов при первом входе функцию
20:42
сохраняем первую часть соответствующие регистры и устанавливаем специальный флаг по которому в дальнейшем определим
20:50
к какой инструкции относятся данные Прочитав второе слово по старшему
20:56
байту вычисляем нужную функцию в которой при помощи заранее записанного
21:02
флага определяем одну из четы тридцати двух битных
21:09
инструкций обратимся немного к теории вызов в восьмом бите имеет атрибут
21:16
который определяет быстрый переход очищенным состоянием или единицей сохранение ключевых значений в теневых
21:23
регистрах которое ранее упоминалось и практически не используются
21:28
запутаться так как в первом слове содержится младшие 8 бит адреса а во втором в старшем байте четыре старших
21:36
бита а середина находится в младшей части собрав всё воедино получаем адрес
21:43
на который перейдёт Рабочая точка программы точно также вычисляется метка для безусловного перехода goto Несмотря
21:51
на то что адресное поле намного превышает допустимый размер памяти большинства контроллеров это вполне
21:57
нормально так как в разных версиях микроконтроллеров она варьируется и может доходить как раз до границ
22:04
указателя например в пик 18 FX 710 размер памяти составляет 65500 слов что
22:12
в четыре раза больше чем в нашем для прямого копирования значения из одного
22:18
регистра в другой также используется тридцати двух битная инструкция так как адреса регистров вне зависимости от их
22:24
принадлежности КСР или gpr занимают по бит соответственно в первом слове
22:30
записан адрес регистра источника а во втором приёмника и последняя инструкция
22:37
состоящая из двух слов которые указывает адрес регистра общего или специального назначения для обращения к нему через
22:45
выбранную косвенную адресацию длина директивы состоит из 10 БИТ за которыми
22:50
следует два бита указывающие на выбранную косвенную адресацию нулевую
22:55
Первую вторую или третью младший 4 бита содержит старшую часть адреса а
23:01
оставшиеся восемь находятся в следующем слове и заключающий блок инструкций
23:07
относится к бито ориентированным то есть с помощью них можно изменять указанный бит или проверять его Если присмотреться
23:15
к ним то они однотипные первые четыре бита – код директивы следующие три бита –
23:22
закодированное значение от нуля до семи которое указывает изменяемый или проверяемый бит в регистре адрес
23:29
которого расположен в младшей части слова флаг типа доступа мы ранее
23:34
рассмотрели разобравшись со всеми кодами инструкций можно сказать что ничего сложного нет в их деза
23:42
самброс задача состоит в том чтобы получить имена для регистров специального назначения и имена флагов
23:48
если они применены для регистров общего назначения будем генерировать
23:53
собственные имена а флаги указывать числом делать это будем В отдельной
23:59
функции которая принимает три параметра первыми двумя указывается старшая и
24:04
младшая части слова а третий используется для вычисления флага по имени регистра который записывается в
24:11
него сначала получим имя регистра зайдя в функцию соберём слово
24:17
из двух байт и
24:25
инициализирует перед началом компиляции вместо имён флагов и регистров специального назначения будут
24:31
возвращаться их числовые представления для этого мы проверяем переменную строки
24:36
в которую записали содержимое ИК файла в следующем условии проверяем запрос имени
24:42
для регистра или флага если переменная SR содержит запись значит получаем
24:48
название флага произведя ещё одну проверку на принадлежность регистра группе ФСР или gpr по значению старшей
24:55
части слова переходим в соответствующую условия для регистров общего назначения
25:02
сгенерирует Rec и двенадцати битного адреса а для специального назначения
25:08
получим название найдя его по адресу в ик файле для этого отформатирую его по
25:14
шаблону который применён в описании и приступим к поиску при отсутствии
25:19
запрошенного адреса Выходим из функции с пустой строкой чтобы записать данные в
25:24
виде таблицы после разбора этой функции расскажу об этом поподробнее если адрес
25:30
был найден приступаем к реверсивного поиску начала строки так как имя регистра находится в этом
25:40
месте найдя символ перевода строки или возврата каретки начинаем перебирать
25:46
печатные символы в обратном порядке до первого пробела или табуляции чтобы
25:51
получить только название которое вернём вызываемой функции
25:58
в ней
26:16
переместимся регистра для которого надо найти флаг так как теперь в переменной
26:22
находится название регистра то выполняется следующее условие в котором
26:27
добавив в строке слова биты приступаем к поиску
26:33
соответствия найдя нужный блок флагов ищем его конец последующей точке
26:40
запятой получив начало и конец текста копируем его в отдельную
26:45
строку в которой по подготовленному формату из комова бита произведём поиск
26:51
соответствующего названия Аналогично тому как искали имя регистра если на
26:56
одном из этапов поиск велся неудачей вместо названия возвращаем числовое представление
27:04
бита вернувшись вызываемый функцию добавляем разделитель и записываем бит в
27:09
соответствующее поле ам структуры В связи с тем что представление записи в таблице никак не
27:16
отличаются от аналогичных записей инструкций то мле в приоритете интерпретирует их как соответствующие
27:23
директивы за исключением тех случаев когда значение выходит за допустимый диапазон например метка перехода
27:30
указывает на незадернутые диапазон как сейчас тогда
27:37
программа записывает слово в виде таблицы в этом участке кода как для шестнадцати битных инструкций так и для
27:43
32х битных в два
27:50
этапа на всём протяжении кода проверяется данное условие
27:58
и последняя функция вычисляет длину записи состоящую из имени регистра флага
28:04
и атрибута если таковые есть для выравнивания поля комментария чтобы
28:09
Исходный код смотрелся красиво а не в шахматном порядке располагались все
28:14
атрибуты Ну вот с основными записями в программной памяти разобрались Осталось получить пользовательское ID слово
28:21
конфигурации и данные епм ID пользователя расположен в массиве
28:28
кода после основных инструкций получив количество байт и данные которых не больше восьми отделяем
28:35
се шапкой от основного кода чтобы было понятно что где начинается записываем
28:41
указатель на раздел памяти User ID пользовательские данные записываются как
28:47
простая таблица добавив соответствующую директиву начинаем дополнять данные в строке признаком шестнадцатеричного
28:54
числа и разделять её на байты
29:02
сформировав строку записываем её в массив найдя следующую строку удаляем ID
29:09
пользователя из файла прошивки и остаток кода возвращаем
29:15
вызываемой функции для дальнейшей расшифровки слово конфигурации
29:21
преобразовывать немножко сложнее так как оно может быть записано в одну строку или разбито на несколько а также в
29:28
зависимости от типа микроконтроллера некоторые регистры недоступны перед дизассемблирование найдём конец блока
29:35
конфигурации по определению следующего раздела или завершению кода и
29:40
извлечённый строки удалим изъяю конфигурацию из хкс
29:45
файла чтобы вернуть остаток кода вызываемой
29:51
функции в цикле пока имеются данные получаем количество байт и адрес
29:56
текущего слова рассчитав индекс конфигурации читаем данные в отдельную переменную и удаляем
30:04
их из исходной строки в следующем цикле приступаем к форматированию строк для
30:09
каждого слова конфигурации которая принимает только один байт по первой строке произведём поиск в Inc файле для
30:17
определения существования данного регистра так как не во всех микроконтроллерах они реализованы
30:22
одинаковы но запись содержит данные под них в виде установленных единиц чтобы не
30:28
разрывать запись если поиск завершился неудачей закомментировать
30:36
основной вид слова конфигурации подставляя необходимые данные после чего
30:42
она записывается в массив объявлений инвертировать флаг выбора старшего или младшего слова удаляем обработанный байт
30:49
из строки завершив обработку покидаем
30:55
функцию с оставшимся и последняя функция которая
31:02
расшифровывает данные для eprom в ней также записываем шапку и начало раздела
31:08
памяти массив ам файла найдя завершение данного блока
31:13
перемещаем его в отдельную строку и удаляем из хкс
31:19
файла в цикле пока имеются данные построчно выбираем записи и с соответствующей директивой записываем их
31:27
в структуру Аналогично как поступали при деза самброс
31:32
ID в конце каждой строки добавляем комментарий в котором расположи запись
31:37
участка кода из которого получили
31:53
данные завершив дисасембли покидаем функцию состав
31:59
файла в итоге у нас осталась последняя строка которая символизирует конец прошивки обработав её покидаем основной
32:07
цикл и переходим к завершающему этапу формирования ам файла чтобы все объявления шли в
32:14
определённом порядке продолжим заполнять массив инициализации после записи слова конфигурации именами регистров общего
32:22
назначения регистры специального назначения записывать не будем так как они объявлены в вчем и файле для того
32:30
чтобы адреса шли в возрастающем порядке форматируется дополнительная строка из порядкового адреса которую попробуем
32:37
найти в общем списке если не удалось ничего найти значит Под таким адресом
32:42
регистр не существует в ином случае записываем в массив объявление
32:49
регистра после каждого прохода увеличиваем Порядковый адрес и проверяем
32:54
достиг он конца диапазона если достиг переходи м к следующему циклу который
32:59
производит расстановку меток в строке в которой находится список всех задействованных переходов находим символ
33:06
табуляции и по его месту положения извлекаем в отдельную переменную имя метки перехода с помощью этого имени
33:14
находим аналогичные списки условных лейблов для каждой строки необходимо Это
33:20
для получения индекса массива в котором записана строка кода в которой осуществляется переход и добавление к
33:27
ней лейбла при деза самброс бы это сделать так как Вектор перехода мог
33:33
указать на инструкцию до которой ещё не дошли для этого пришлось создавать два списка первый для каждой строки кода с
33:41
индексом в массиве который может быть произведена адресация и второй в который
33:46
записывались имена только фактических переходов остались последние два цикла
33:53
которые непосредственно формируют сам ам файл с Чита все данные из массива с
33:59
объявлениями и инициализации и записываются в
34:08
строку следующий цикл производит сборку строки кода и соответствующих полей для
34:14
визуального разделения вызываемых под программ добавлены разделители из равно
34:19
чтобы программа не выглядела слишком монотонно завершаем файл последним
34:25
разделителем и директивой кон кода получив доступ к соответствующему виду
34:30
выводим сформированную строку и устанавливаем флаг модификации чтобы активировать кнопку сохранение вот
34:38
собственно весь алгоритм Диза ассамбле Как видите во втором окне получили Исходный
34:46
код сохраним его под именем
34:53
тест перед тем как начать разбирать алгоритм полученной программы необходимо
34:58
убедиться в правильности дисас самброс могут быть неверно
35:04
интерпретироваться данные для этого я создал временный проект в который
35:09
скопирую полученный
35:14
файл добавив его в папку источника откроем и скомпилировать
35:27
новую прошивку сравним её с
35:37
исходной есть небольшое различие во второй строке записан лишний пустой
35:42
машинный цикл Несмотря на то что это не критичная ошибка так как между вектором сброса и прерыванием могут находиться
35:49
четыре инструкции лучше её исправить
36:09
Ну вот теперь файлы полностью идентичны попробуем зас
36:23
самброс контроллер на 2550 вводя символы в поле выбора можно быстрее найти
36:30
требуемые мцу так как ранее был сохранён файл его
36:37
путь запомнила программа и когда повторно была нажата кнопка сохранить новые данные записались поверх
36:43
предыдущих без вызова диалога выбора пути перенесём файл в проект и обновим
36:50
его
36:58
скомпилировать проект не получилось из-за того что одна из инструкций вылезла за диапазон
37:05
[музыка]
37:12
памяти это по большей части ошибка в компиляторе у него счётчик инструкций
37:17
неверно посчитал объём данных если посмотреть на адрес завершающей строки
37:23
то он находится на последнем адресе а не за ним если удалить один ноб а на его
37:29
месте записать адрес для последней строки то компиляция пройдёт
37:36
успешно по индикатору объёма видно что задействована вся память без исключения
37:41
из-за того что прошивка была прочитана вместе с очищенными ячейками соответственно она была так и десам
37:49
блина сравним [музыка]
37:56
прошивки отст в конце раздела программной памяти последнее слово
38:01
которое у нас не влезал началось с новой строки Хотя в предыдущей есть ещё место
38:07
ещё ID пользователя со словом конфигурации поменялись местами с епм но
38:12
как я говорил ранее От перестановки мест разделов результат не изменяется и
38:18
напоследок проверим работу программы на ещё одной прошивки под другой тип микроконтроллера
38:33
в компиляторе тоже изменим [музыка]
38:43
микроконтроллер при компиляции получили три ошибки все они связаны с переходом в
38:50
несуществующее место притом не из-за ошибки в программе А из-за того что эти
38:55
данные предназначены для таблицы я ранее говорил что значения в таблицах могут
39:00
совпадать с кодом инструкций ам в приоритете старается расшифровать данные
39:05
а не просто заниматься перезапись слов изменим неверные строчки на табличную
39:10
запись как раз для этого пригодится комментарий из которого возьмём необходимые значения по сути надо
39:18
переписать все строчки кода которые относятся к таблице но у нас нет пока такой задачи по приведению программы в
39:24
соответствующий вид надо сначала добиться совпадение [музыка]
39:36
файлов Ну вот компиляция прошла успешно сравним
39:42
[музыка] файлы остались две неточности найдём
39:50
адрес 26 Fe и посмотрим что с ним не так
39:59
по этому адресу записан ноб для выравнивания адресов памяти изменим его
40:04
на указатель повторно
40:25
скомпилировать для из Ассамблея файлов некоторые поддерживали только определённые микроконтроллеры а не всю
40:32
линейку выравнивание аргументов либо отсутствовало либо было выполнено пробелами из-за чего всё расползалась
40:39
выходной файл содержал уйму ошибок и перед тем как приступить к работе
40:44
приходилось очень долго сидеть и приводить всё в порядок вручную переводя код в инструкции вот собственно всё
40:51
программу исходник приложу в описании под видео если вы найдёте какие-либо неточности программы Пишите в
40:58
комментариях я постараюсь оперативно их исправить Несмотря на то что я прогнал много различных прошивок всё равно может
41:06
что-нибудь пойти не так на этом я с вами не прощаюсь До новых встреч

Поделиться: