Jump to content

    
Sign in to follow this  
aleksis33

перевод ассемблерного кода на язык C

Recommended Posts

Предлагаю свернуть обсуждение. Автор озвучил требования, выложил необходимые исходные данные. Нет смысла советовать ему делать что-то самому - тема в разделе "предлагаю работу". Кому интересно - связываются с автором или оставляют свои контактные данные. Кому интересно "потрещать" - создавайте отдельную тему в другом разделе, здесь можно разместить ссылку на нее.

Share this post


Link to post
Share on other sites

Задачу можно упростить. Не на С, а на том же ассемблере, но хорошо структурированном, с комментариями, с именованными переменными и ссылками,

чтобы можно было легко найти требуемое место и изменить при необходимости. 

Схему девайса вышлю по запросу.

 

 

Share this post


Link to post
Share on other sites
On 3/5/2019 at 3:14 PM, jcxz said:

Автор, судя по всему, дизассемблировал фрагмент swap-файла своей винды

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

Угадать по выложенному файлу модель контроллера - пальцем в небо (кто-нибудь помнит наизусть адреса периферийных регистров?), но кортекс узнаётся безошибочно.

 

On 3/5/2019 at 2:17 PM, bzx said:

это зашифрованный загружаемый код

Ага, конечно.

ROM:08005AAE word_8005AAE    DCW 1500, 250, 1680, 90, 70, 500
ROM:08005AAE                 DCW 1502, 262, 1680, 90, 70, 525
ROM:08005AAE                 DCW 1504, 274, 1680, 90, 70, 550
ROM:08005AAE                 DCW 1506, 286, 1680, 90, 70, 575
ROM:08005AAE                 DCW 1508, 298, 1680, 90, 70, 600
ROM:08005AAE                 DCW 1510, 310, 1680, 90, 70, 625
 

1500 - это "Юстас", "250" - Алекс. Именно так и никак иначе.

Там действительно 25 кило кода (работа с АЦП, ЦАП, ногодрыг несколькими ножками + какая-то непонятная математика в развесистых свичах) и 200 с фигом килобайт таблиц.

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

Share this post


Link to post
Share on other sites

RSCHI   PC, R0, #0x12C000
RSCEQ   R4, R11, R10
MOVEQ   R8, 0xFFFF5FFF
BCC     0xFFE7D4F4
MVNGES  R0, R0,LSR#1
BGE     0xFFAC427C
LDRGTB  R0, [R11,#0xC2C]!
SVCMI   0xEAEC02
RSCGE   LR, R11, #0x7200
ANDHIS  R1, R10, #0x3A000000
RSCEQ   R4, R11, #0x20000000
ANDPL   R0, R0, #0x2A

Edited by Aldec

Share this post


Link to post
Share on other sites
On 3/11/2019 at 9:14 AM, aleksis33 said:

Задачу можно упростить. Не на С, а на том же ассемблере, но хорошо структурированном, с комментариями, с именованными переменными и ссылками,

чтобы можно было легко найти требуемое место и изменить при необходимости. 

Вставлю 5 коп со своей колокольни.

Задачу можно упростить, если в проекте нужно сделать небольшие изменения. Например удалить защиту основанную на времени работы или добавит некоторую функциональность.

Можно сказать, то что вы описываете, это "вся работа" минус 300 евро.

Упростить работу действительно можно предоставив дополнительную информацию.

Как уже сказано схему, инструкцию по эксплуатации устройства и т.д.

Очень хорошо иметь само устройство.

Есть ли в устройстве бутлоадер?

Не плохо, собрать по крупицам информацию об использованных библиотеках и компиляторах.

Например: анонс на сайте  прибора о том, что ПО прибор обновлено до FreeRTOS 8.0.1

//----------------

По поводу таблиц

Вставляю картинку с таблицами и прокомментирую текст в ней


ROM:08005A10 loc_8005A10               
ROM:08005A10                 LDR     R4, =off_803C830                         начало таблицы
ROM:08005A12                 LDR     R5, =dword_803C850                    окончание таблицы
ROM:08005A14                 B       loc_8005A24

ROM:08005A16 loc_8005A16                            
ROM:08005A16                 LDR     R0, [R4,#0xC]                             загружаем адрес вызываемой функции
ROM:08005A18                 ORR.W   R3, R0, #1                                устанавливаем признак Thumb - нечетность адреса. и копируем его в R0
ROM:08005A1C                 LDMIA.W R4, {R0-R2}                            загружаем 3 параметра функции
ROM:08005A20                 BLX     R3                                              вызываем функцию с тремя параметрами   
ROM:08005A22                 ADDS    R4, #0x10

ROM:08005A24 loc_8005A24                            
ROM:08005A24                 CMP     R4, R5                                     все функции вызваны?
ROM:08005A26                 BCC     loc_8005A16                            не все, продолжаем
 

Уже пару скрытых функций, по адресам  0x0803C830 + 0x0C и 0x0803C840 + 0x0C

По адресу 0x0803C830 + 0x0C  лежит указатель на функцию 08005A34  

Можно сказать дизассемблер справился с этой задачей, нужно только пару строк внести "внутрь" функции

ROM:08005A34 ; ---------------------------------------------------------------------------
ROM:08005A34                 PUSH    {R4-R6,LR}
ROM:08005A36                 ADD.W   R4, R1, R2
ROM:08005A3A
ROM:08005A3A loc_8005A3A              

А сколько таких "закладок" еще есть?

P.S. Я бы не рассчитывал на то, что проект можно привести к обслуживаемому виду менее чем за 3 месяца.

Да и как "сдавать" проект? Байт в байт не напишешь.

Если проверять по функциональности, то "написание ТЗ" на функциональность равно полной постановке задачи.

В этом случая дешевле/быстрее написать с нуля.


 

disam.png

Share this post


Link to post
Share on other sites
10 hours ago, misyachniy said:

 Есть ли в устройстве бутлоадер?

Нету. И фриртоса нету. Есть огроменный бесконечный цикл, прерывание по TIM3, которое дрыгает ножкой, и два DMA, которые перекладывают данные из двух АЦП в память. Ещё UART есть (только на передачу).

 

10 hours ago, misyachniy said:

А сколько таких "закладок" еще есть?

Ноль. Либо я плохо искал. А эти закладки - вовсе не закладки, а, подозреваю, с++ конструкторы глобальных объектов. Компилятору так удобнее - сделать список и итерироваться по нему. Каких-то других особенностей с++ в коде не обнаружено - никаких перегрузок и прочей динамической памяти.

 

Вероятно, автору интересней всего получить содержимое тех функций, которые пережёвывают вход с АЦП и выдают его в ЦАП.

Я ЦОС не умею, поэтому сходу никаких знакомых паттернов там не увидел. Возможно, более грамотный специалист после тщательного допроса автора сразу скажет "здесь делаем преобразование А, потом по этому условию делаем Б и подставляем туда значение из таблицы В".

10 hours ago, misyachniy said:

Да и как "сдавать" проект?

Если автор адекватный (пока обратное не доказано), идеальный вариант - юнит тесты, показывающие одинаковое поведение оригинала и переписанных функций (для каждой функции по пачке тестов). Их всё равно писать надо в обязательном порядке. Железка при этом не особо нужна - проще даже на эмуляторе.

 

Это я пол-дня потратил, мозг размять. Потратить ещё месяц на переписывание мне что-то не хочется...

Share this post


Link to post
Share on other sites
12 часов назад, esaulenka сказал:

идеальный вариант - юнит тесты, показывающие одинаковое поведение оригинала и переписанных функций (для каждой функции по пачке тестов). Их всё равно писать надо в обязательном порядке. Железка при этом не особо нужна - проще даже на эмуляторе.

Тогда предложенный мной вариант с расположением всего (или части) кода в char const t[] = {...} - вполне подходит. Он вполне пройдёт все такие тесты.

PS: И на него не потребуется месяца или даже недели.

В 14.03.2019 в 16:07, esaulenka сказал:

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

Угадать по выложенному файлу модель контроллера - пальцем в небо (кто-нибудь помнит наизусть адреса периферийных регистров?), но кортекс узнаётся безошибочно.

Мой коммент касался качества приведённого в первом посте дизассемблированного текста. Если Вы не поняли...

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

мной вариант ... вполне подходит

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

Share this post


Link to post
Share on other sites
41 минуту назад, esaulenka сказал:

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

Для неспособных понимать прочитанное с первого раза, разжую доходчиво: Как критерий выполнения задачи при сдаче работы заказчику ваш "идеальный вариант" - абсолютно не подходит. Ибо запросто можно отреверсить ту часть алгоритма, что попроще, а то что не получается - засунуть внутрь блоков данных.

Share this post


Link to post
Share on other sites
On 3/11/2019 at 10:14 AM, aleksis33 said:

Задачу можно упростить. Не на С, а на том же ассемблере, но хорошо структурированном, с комментариями, с именованными переменными и ссылками,

чтобы можно было легко найти требуемое место и изменить при необходимости. 

Схему девайса вышлю по запросу.

 

Возможно в девайсе есть какие то дополнительные флэшки  а прошивка просто инициализация контроллера.

Edited by Aldec

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this