|
Перевод дизассемблера обратно в исходник |
|
|
|
Jun 13 2018, 15:08
|
Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674
|
Приветствую Уважаемые! Есть дизассемблированный код процессора pic18ф4620/2620, пытаюсь собрать исходник обратно с помощью МПЛАБ IDE МPASMWIN, чтобы потихоньку разбираться что к чему и как работает. Естественно вылазит куча ошибок. Самая распространенная это Error[126] 32273 : Argument out of range (8423 not between FC00 and 03FF). В коде данных строк стоит переход BRA 720. Про команду эту почитал, и вроде метка есть L720. Но ругается я так понимаю на диапазон. Как узнать почему ? Та же ошибка, только тут уже не нравиться RCALL L1903 RCALL 987 NOP BRA L1850 BRA L1851 NOP NOP BNC L1852. и еще Error[126] 27724 : Argument out of range (9FF8 not between 0000 and FFFF) // CALL 0x0F9FF8,FAST Error[126] 27769 : Argument out of range (D29A not between 0000 and FFFF) // GOTO 0x1ED29A Понятно что, тут возможно код так дизассемблировался и в идеале он уже не тот, но все же 80% кода собирается и выглядит один в один с исходником хекса, если все убрать где начинаются это ошибки. Помогите исправить, чтобы программа компилировалась. https://mega.nz/#!FMZlGLzZ!EtARv8iv...7F1VN1M4MkJKPFAСам код.
|
|
|
|
|
Jun 13 2018, 15:55
|
Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674
|
Тут использовался не встроенный в МПЛАБ дизассемблер, с ним многие говорят что код получается нормальный, ничего подобного. Для дизассемблера использовался не он, как раз сторонний.
|
|
|
|
|
Jun 14 2018, 05:46
|
Гуру
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295
|
Цитата(Baser @ Jun 13 2018, 18:52) Тут нужно или глазами эти куски смотреть, или применять сторонние интерактивные дизассемблеры. А лучше (в 99% случаев, как мне представляется), проще, надежнее и дешевле - нанять специалиста, который напишет программу для этого ПИКа заново, с нуля. Идея с дизассемблированием и последующей перекомпиляцией крайне неудачна, ИМХО. Если, конечно, речь не идет о простейшем проекте вроде светодиодной мигалки ...
|
|
|
|
|
Jun 14 2018, 11:20
|
Местный
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081
|
Цитата(k155la3 @ Jun 13 2018, 22:44) Более удобного софта не встречалось. Да без разницы. Любой дизассемблер не умеет отличать области кода от данных, таблиц и т.п.
|
|
|
|
|
Jun 14 2018, 14:24
|
Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674
|
В этом все и дело, сам код без проблем компилируется, а вот блок данных нет, именно в нем ошибки и идут. Как их вернуть в исходное или рабочее состояние. Код написан на АСМе, с данными там вообще не понятка, т.к если смотреть по IDA то видно слова типа "Подключение к БД", Меню и т д... Соответственно без данных программа включается, но не работает как надо и соотвественно 20% кода который компилируется в hex получается лажой.
Сообщение отредактировал gem - Jun 14 2018, 14:26
|
|
|
|
|
Jun 14 2018, 15:45
|
Профессионал
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848
|
литералы смотрите в FAR. По адресу или смещению находите эти блоки в IDA (или в вашем исходнике ASM) и помечаете их как данные. Если литералы не видны - возможно юникод. Если строки сишные - терминатор 0x00. Компилируете свой ASM. Из hex-модуля преобразуете в bin-образ памяти флеш. Сверяете длину "нового" bin-образа с "старым"/исходным-образцом. Если длина одинаковая - делаете побайтное сравнение fc f_new.bin f_old.bin /b >bin_log.txt Если совпало - "правка" нового асм-файла корректна. Идем далее. Если не совпало - смотрим в каком месте и что не совпадает. и т д,, получаем удовольствие от процесса
|
|
|
|
|
Jun 15 2018, 06:22
|
Местный
Группа: Участник
Сообщений: 211
Регистрация: 18-03-13
Из: Питер
Пользователь №: 76 081
|
Цитата(gem @ Jun 14 2018, 18:24) Как их вернуть в исходное или рабочее состояние. Помнится проделывал подобное для 51 МК. В принципе, выше вкратце уже сказали. Единственно что, данные не обязательно являются текстом, а если являются, то вряд ли в МК будет юникод. А собственно для чего Вам это надо? У меня тогда стояла задача дополнить старт устройства дополнительной фичей. Поэтому, немного разобравшись с программой (по дизасму), сделал в самом начале переход на конец программы (где было свободное место) и там уже написАл необходимую вставку с возвратом в точку перехода. Дальше уже более для интереса, нашёл куски текста, указал дизасму адреса, дизассэмблировал. Опять засунул в ИДЕ (точнее не весь, а только обновлённые куски, так как по ходу в листинге менял названия меток и добавлял коментарии), стал анализировать программу и находить блоки данных. По-новой в дизасм и т.д. Периодически, после изменений АСМа, компилировал в BIN и сверял с исходным (пользовался вот программкой Dronf). И, да! Удовольствие получил обалденное.
|
|
|
|
|
Jun 15 2018, 16:09
|
Группа: Участник
Сообщений: 12
Регистрация: 27-05-18
Пользователь №: 104 674
|
Чтобы что-то дополнить нужно исходник иметь, для этого и делается, плюс для себя поразбираться в коде. Просто хочется сделать готовый исход, который можно будет править и добавлять в него. В Hex новое не запихнешь Данные то понятно они там есть точно, в сам процесс вникнуть не могу пока. Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект? Под литералами что понимается? Сами данные. Вопросов больше чем ответов У меня вообще такое чувство что там типа базы данных. Либо вывод какой-то на дисплей, терминал. Чего изначально нет. Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал.
Сообщение отредактировал gem - Jun 15 2018, 16:15
|
|
|
|
|
Jun 15 2018, 17:10
|
Профессионал
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848
|
Цитата(gem @ Jun 15 2018, 19:09) (1)Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект? (2)Под литералами что понимается? (3)Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал. (1) изучаете ASM для Вашего процессора + сам проц., распределение памяти, портов, адреса векторов прерывания итд. для абстрактного процессора - примерно так Код org 8000h; начало сегмента данных, "вычисляется" из дампа, стартовый адрес строки или данных L_START_MSG: DS 'LOAD'; сюда переписываем текст из дампа прошивки. DB 00h (2) литерал - набор символов, как правило "читабельных" для вывода на экран, передачи на терминал итп. Расположены в памяти последовательно, кодировки символов могут быть разные. "закрывающего" последнего символа может не быть (а может быть). Литерал, за последним символом которого расположен код 00 - это "сишная" строка. (для 1-байтовых символов ASCII) (3) Если для Вас приемлем (1) и будете отвечать на вопросы, а не "кодироваться".
|
|
|
|
|
Jun 17 2018, 14:40
|
Профессионал
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848
|
Цитата(Марк_Я @ Jun 16 2018, 07:11) . . . под литералом понимается константа в поле команды. Перечитал определение из "кладезя мудрости". Если в "двух словах" - различные константы в исходном коде. (ониже, - в машинных кодах команд). Бинарные константы "смотреть" в дампе достаточно проблематично, а вот символьные и строковые - вполне комфортно. Поэтому я начинаю "разбор" с них. Затем - удобно выделять константы во флеш формата float'32 (например массивы, таблицы достаточно легко идентифицировать). Лично мне (почему-то) литералами бинарные значения float как-то называть некомфортно. Но это - уже психоанализ
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|