gem 0 13 июня, 2018 Опубликовано 13 июня, 2018 · Жалоба Приветствую Уважаемые! Есть дизассемблированный код процессора 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 Сам код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 13 июня, 2018 Опубликовано 13 июня, 2018 · Жалоба Встроенные в IDE дизассемблеры, как правило, не обладают хорошим интеллектом, поэтому спотыкаются об секции с данными, таблицами и тому подобным. И начинают дизассемблировать данные как код. Ессно получается лабуда. Тут нужно или глазами эти куски смотреть, или применять сторонние интерактивные дизассемблеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gem 0 13 июня, 2018 Опубликовано 13 июня, 2018 · Жалоба Тут использовался не встроенный в МПЛАБ дизассемблер, с ним многие говорят что код получается нормальный, ничего подобного. Для дизассемблера использовался не он, как раз сторонний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 13 июня, 2018 Опубликовано 13 июня, 2018 · Жалоба IDA. Посмотрите, возможно есть PIC. Более удобного софта не встречалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 14 июня, 2018 Опубликовано 14 июня, 2018 · Жалоба Тут нужно или глазами эти куски смотреть, или применять сторонние интерактивные дизассемблеры. А лучше (в 99% случаев, как мне представляется), проще, надежнее и дешевле - нанять специалиста, который напишет программу для этого ПИКа заново, с нуля. Идея с дизассемблированием и последующей перекомпиляцией крайне неудачна, ИМХО. Если, конечно, речь не идет о простейшем проекте вроде светодиодной мигалки ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 июня, 2018 Опубликовано 14 июня, 2018 · Жалоба Если, конечно, речь не идет о простейшем проекте вроде светодиодной мигалки ... А в этом случае тем более проще с нуля написать. Чем ковыряться в много-десятко-килобайтной инициализации чего-нить посредством PICо-HALа, в которой потеряется само мигание на пару десятков команд. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 14 июня, 2018 Опубликовано 14 июня, 2018 · Жалоба Посмотрел листинг. Всего - около 500 страниц текста. Если убрать NOP - примерно 250. Если есть возможность выделить код и данные, а также обработчики прерывания, возможно удастся сократить еще в несколько раз. Ошибки могут лезть по причине "отработки" дизассемблера по участку данных, строк-литералов. Естественно, получается бредо-код. Поэтому сперва просмотрите хотябы bin-образ прошивки в символьном виде напредмет нахождения литералов. В ASM этот блок пометьте как массив данных. --------- Возиться с этим имеет смысл, если проект изначально писан на ASM и прикладная задача нетривиальная. Если это код С(++) то лучше переписать. ТС, какая прикладная задача прошивки ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 14 июня, 2018 Опубликовано 14 июня, 2018 · Жалоба Более удобного софта не встречалось. Да без разницы. Любой дизассемблер не умеет отличать области кода от данных, таблиц и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gem 0 14 июня, 2018 Опубликовано 14 июня, 2018 (изменено) · Жалоба В этом все и дело, сам код без проблем компилируется, а вот блок данных нет, именно в нем ошибки и идут. Как их вернуть в исходное или рабочее состояние. Код написан на АСМе, с данными там вообще не понятка, т.к если смотреть по IDA то видно слова типа "Подключение к БД", Меню и т д... Соответственно без данных программа включается, но не работает как надо и соотвественно 20% кода который компилируется в hex получается лажой. Изменено 14 июня, 2018 пользователем gem Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 14 июня, 2018 Опубликовано 14 июня, 2018 · Жалоба литералы смотрите в FAR. По адресу или смещению находите эти блоки в IDA (или в вашем исходнике ASM) и помечаете их как данные. Если литералы не видны - возможно юникод. Если строки сишные - терминатор 0x00. Компилируете свой ASM. Из hex-модуля преобразуете в bin-образ памяти флеш. Сверяете длину "нового" bin-образа с "старым"/исходным-образцом. Если длина одинаковая - делаете побайтное сравнение fc f_new.bin f_old.bin /b >bin_log.txt Если совпало - "правка" нового асм-файла корректна. Идем далее. Если не совпало - смотрим в каком месте и что не совпадает. и т д,, получаем удовольствие от процесса :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Smen 3 15 июня, 2018 Опубликовано 15 июня, 2018 · Жалоба Как их вернуть в исходное или рабочее состояние. Помнится проделывал подобное для 51 МК. В принципе, выше вкратце уже сказали. Единственно что, данные не обязательно являются текстом, а если являются, то вряд ли в МК будет юникод. А собственно для чего Вам это надо? У меня тогда стояла задача дополнить старт устройства дополнительной фичей. Поэтому, немного разобравшись с программой (по дизасму), сделал в самом начале переход на конец программы (где было свободное место) и там уже написАл необходимую вставку с возвратом в точку перехода. Дальше уже более для интереса, нашёл куски текста, указал дизасму адреса, дизассэмблировал. Опять засунул в ИДЕ (точнее не весь, а только обновлённые куски, так как по ходу в листинге менял названия меток и добавлял коментарии), стал анализировать программу и находить блоки данных. По-новой в дизасм и т.д. Периодически, после изменений АСМа, компилировал в BIN и сверял с исходным (пользовался вот программкой Dronf). И, да! Удовольствие получил обалденное. :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gem 0 15 июня, 2018 Опубликовано 15 июня, 2018 (изменено) · Жалоба Чтобы что-то дополнить нужно исходник иметь, для этого и делается, плюс для себя поразбираться в коде. Просто хочется сделать готовый исход, который можно будет править и добавлять в него. В Hex новое не запихнешь :) Данные то понятно они там есть точно, в сам процесс вникнуть не могу пока. Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект? Под литералами что понимается? Сами данные. Вопросов больше чем ответов :) У меня вообще такое чувство что там типа базы данных. Либо вывод какой-то на дисплей, терминал. Чего изначально нет. Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал. Изменено 15 июня, 2018 пользователем gem Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 15 июня, 2018 Опубликовано 15 июня, 2018 · Жалоба (1)Как данные пометить ? Нашел, да данные и текст даже есть, но не везде. Теперь как мне перенести все это правильно в компилируемый проект? (2)Под литералами что понимается? (3)Может тут есть люди которые шарят в этом и могут подсказать как и что. Код на ассемблере был написал. (1) изучаете ASM для Вашего процессора + сам проц., распределение памяти, портов, адреса векторов прерывания итд. для абстрактного процессора - примерно так org 8000h; начало сегмента данных, "вычисляется" из дампа, стартовый адрес строки или данных L_START_MSG: DS 'LOAD'; сюда переписываем текст из дампа прошивки. DB 00h (2) литерал - набор символов, как правило "читабельных" для вывода на экран, передачи на терминал итп. Расположены в памяти последовательно, кодировки символов могут быть разные. "закрывающего" последнего символа может не быть (а может быть). Литерал, за последним символом которого расположен код 00 - это "сишная" строка. (для 1-байтовых символов ASCII) (3) Если для Вас приемлем (1) и будете отвечать на вопросы, а не "кодироваться". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 16 июня, 2018 Опубликовано 16 июня, 2018 · Жалоба В системе команд PIC18 (как и других PIC-ов) под литералом понимается константа в поле команды. То есть в команде movlw 0x5C константа 0x5C является литералом. Отсюда и аббревиатура самой команды move literal to working register. По поводу дизассемблирования. Автоматические дизасмы - полная фигня. Для восстановления исходника на АСМе из бинарника требуется только текстовая декомпиляция и ПОНИМАНИЕ ФУНКЦИОНАЛА исследуемого прибора. Ну и знание архитектуры МК, естественно. Как то у меня оказался утерянным последний исходник под dsPIC33, но остался экземпляр живого устройства с открытой прошивкой и исходник предыдущей прошивки. Строк кода - около 3000. Изменения касались лишь примерно 5 % исходника (по сравнению с предыдущим). Я пахал как папа Карло примерно 2 недели. Восстановил, но имена пары флагов так и остались бессмысленными. Примерно понимаю функционал, но сил и времени на эти флаги уже не осталось. Плюнул и оставил их как есть - безымянными. Это я к тому, что даже свой собственный код с полным пониманием что куда и откуда декомпилировать крайне сложно и долго. Порой гораздо проще и полезнее написать заново. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 17 июня, 2018 Опубликовано 17 июня, 2018 · Жалоба . . . под литералом понимается константа в поле команды. Перечитал определение из "кладезя мудрости". Если в "двух словах" - различные константы в исходном коде. (ониже, - в машинных кодах команд). Бинарные константы "смотреть" в дампе достаточно проблематично, а вот символьные и строковые - вполне комфортно. Поэтому я начинаю "разбор" с них. Затем - удобно выделять константы во флеш формата float'32 (например массивы, таблицы достаточно легко идентифицировать). Лично мне (почему-то) литералами бинарные значения float как-то называть некомфортно. Но это - уже психоанализ :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться