Преобразуйте ASM в C (не, перепроектируют),

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

Микрочип обеспечивает некоторый исходный код бесплатно (я не хочу отправлять его здесь в случае, если это нет - нет. В основном, google AN937, нажмите на первую ссылку и существует ссылка для "исходного кода", и это - заархивированный файл). В ASM и когда я смотрю на него, я начинаю идти косоглазый. Я хотел бы преобразовать его во что-то напоминающее язык типа c так, чтобы я мог следовать вперед. Поскольку строки, такие как:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

вероятно, очень просты, но они ничего не значат для меня.

Может быть, некоторые автоматизировали ASM к переводчику C там, но все, что я могу найти, является людьми, говорящими его невозможное. Откровенно говоря, его невозможное для него, чтобы быть невозможным. Оба языка имеют структуру, и та структура, конечно, может быть переведена.

24
задан Trilarion 21 August 2019 в 14:24
поделиться

11 ответов

Вы можете полностью создать программу на языке ассемблера. Проблема в том, что это может не выглядеть так, как вы думаете, а может и будет. Мой PIC заржавел, но я использую другой ассемблер, скажем, у вас был

add r1,r2

. В C, допустим, он становится

r1 = r1 + r2;

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

q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;

Длинный и растянутый, но ясно, что mem [0x12] = mem [0x12] + mem [0x13];

Эти ячейки памяти, скорее всего, являются переменными, которые не будут прыгать, как скомпилированный код C для процессора с кучей регистров. Рисунок может облегчить определение переменных, а затем выполнить поиск и заменить их, чтобы назвать их в файле.

То, что вы ищете, называется статическим двоичным переводом, не обязательно переводом из одного двоичного файла в другой ( один процессор на другой), но в этом случае перевод из двоичного кода pic в C. В идеале вам нужно взять ассемблер, указанный в примечании к приложению, и собрать его в двоичный файл с помощью инструментов микрочипа, а затем выполнить перевод. Вы также можете выполнять динамическую двоичную трансляцию, но у вас еще меньше шансов найти один из них, и это обычно приводит не к C, а к одному двоичному файлу в другой. Вы когда-нибудь задумывались, как работают эти 15-долларовые джойстики в wal-mart с pac-man и galaga? Ром из аркады был преобразован с использованием статической двоичной трансляции, оптимизирован и очищен, а C или любой другой промежуточный язык скомпилирован для нового целевого процессора в портативном компьютере. Я полагаю, что не все из них были сделаны таким образом, но я почти уверен, что некоторые из них были.

Вопрос на миллион долларов, вы можете найти статический двоичный транслятор для картинки? Кто знает, наверное, вам придется написать его самому. И угадайте, что это значит, вы пишете дизассемблер, и вместо дизассемблирования до инструкции в собственном синтаксисе ассемблера, например add r0, r1, ваш дизассемблер распечатывает r0 = r0 + r1; К тому времени, когда вы закончите этот дизассемблер, вы будете знать язык ассемблера pic настолько хорошо, что вам не понадобится переводчик asm на C. У вас проблема с курицей и яйцом.

Вопрос на миллион долларов: можете ли вы найти статический двоичный транслятор для картинки? Кто знает, наверное, вам придется написать его самому. И угадайте, что это значит, вы пишете дизассемблер, и вместо дизассемблирования до инструкции в собственном синтаксисе ассемблера, например add r0, r1, ваш дизассемблер распечатывает r0 = r0 + r1; К тому времени, когда вы закончите этот дизассемблер, вы будете знать язык ассемблера pic настолько хорошо, что вам не понадобится переводчик asm на C. У вас проблема с курицей и яйцом.

Вопрос на миллион долларов: можете ли вы найти статический двоичный транслятор для картинки? Кто знает, наверное, вам придется написать его самому. И угадайте, что это значит, вы пишете дизассемблер, и вместо дизассемблирования до инструкции в собственном синтаксисе ассемблера, например add r0, r1, ваш дизассемблер распечатывает r0 = r0 + r1; К тому времени, когда вы закончите этот дизассемблер, вы будете знать язык ассемблера pic настолько хорошо, что вам не понадобится переводчик asm на C. У вас проблема с курицей и яйцом.

К тому времени, когда вы закончите этот дизассемблер, вы будете знать язык ассемблера pic настолько хорошо, что вам не понадобится переводчик asm на C. У вас проблема с курицей и яйцом.

К тому времени, когда вы закончите этот дизассемблер, вы будете знать язык ассемблера pic настолько хорошо, что вам не понадобится переводчик asm на C. У вас проблема с курицей и яйцом.

38
ответ дан 28 November 2019 в 22:11
поделиться

Трудно преобразовать функцию из asm в C, но это можно сделать вручную. Преобразование всей программы с помощью декомпилятора даст вам код, который может быть невозможно понять, поскольку большая часть структуры была потеряна во время компиляции. Без значимых имен переменных и функций результирующий код на языке C все еще очень трудно понять.

0
ответ дан 28 November 2019 в 22:11
поделиться

Нелегко.

Одним из величайших преимуществ C перед ASM, помимо удобочитаемости, было то, что он предотвращал "хитрые" программные уловки.

В ассемблере можно делать множество вещей, которые не имеют прямого эквивалента на C, или задействовать извилистый синтаксис в C.

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

Вдобавок вся память ассемблера - это, по сути, «структура»; хранилище распределяется в том порядке, в котором оно определено (в отличие от C, где хранилище заказывается по прихоти среды выполнения). Многие программы ASM зависят от точной схемы хранилища - чтобы добиться того же эффекта в C, вам нужно будет определить все хранилище как часть единой структуры.

Также есть много недопустимых инструкций (в старых моделях IBM manframes LA, адрес загрузки, инструкция регулярно использовались для выполнения простых арифимических операций, так как это было быстрее и не требовалось регистра переполнения)

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

3
ответ дан 28 November 2019 в 22:11
поделиться

Там должен быть какой-то автоматический переводчик ASM на C, но все, что я могу найти, - это люди, которые говорят, что это невозможно. Честно говоря, это невозможно.

Нет, это не так. Компиляция теряет информацию: в окончательном объектном коде информации меньше, чем в исходном коде C. Декомпилятор не может волшебным образом создать эту информацию из ничего, поэтому настоящая декомпиляция невозможна.

6
ответ дан 28 November 2019 в 22:11
поделиться

Посмотрите это: декомпилятор

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

3
ответ дан 28 November 2019 в 22:11
поделиться

Однажды я работал над проектом, в котором значительную часть интеллектуальной собственности составляли серьезные алгоритмы, закодированные в ассемблерном коде x86. Чтобы перенести код во встроенную систему, разработчик этого кода (не я) использовал инструмент от компании MicroAPL (если я правильно помню):

Я был очень, очень удивлен тем, насколько хорош этот инструмент.

С другой стороны, я думаю, что это одна из тех вещей типа «если ты спрашиваешь, ты не можешь себе этого позволить» (их ценовые диапазоны для одноразового преобразования проекта составляют около 4 линий сборки, обрабатываемых за доллар).

Но часто процедуры сборки, которые вы получаете от поставщика, упакованы в виде функций, которые могут быть вызваны из C - до тех пор, пока процедуры делают то, что вы хотите (на процессоре, который вы хотите использовать),

7
ответ дан 28 November 2019 в 22:11
поделиться

Получить обратно точно такой же исходный код из скомпилированной программы практически невозможно. Но декомпиляторы были областью исследований в области информатики (например, декомпилятор dcc , который был проектом PhD).

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

Возможно, вы захотите проверить Boomerang , чтобы узнать о недавних усилиях с открытым исходным кодом в обобщенном декомпилятор.

19
ответ дан 28 November 2019 в 22:11
поделиться

Это не невозможно, просто очень сложно. Опытный ассемблер и программист на C, вероятно, могли бы это сделать, или вы могли бы использовать декомпилятор . Некоторые из них неплохо справляются с преобразованием asm в C, хотя вам, вероятно, придется переименовать некоторые переменные и методы.

Посетите этот сайт для получения списка декомпиляторов, доступных для архитектуры x86. .

4
ответ дан 28 November 2019 в 22:11
поделиться

Я могу сказать с гарантией 99%, что готового конвертера для этого ассемблера нет, поэтому его нужно написать. Вы можете просто реализовать это, заменив команду ASM функцией C:

movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);

Эта часть проста :) Затем вам нужно реализовать каждую функцию. Вы можете объявить регистры как глобальные, чтобы упростить задачу. Также вы можете использовать не функции, а #defines, при необходимости вызывая функции. Это поможет с обработкой аргументов / результатов.

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here

Особый случай - директивы / метки ASM, я думаю, что их можно преобразовать только с помощью #defines.

Самое интересное начинается, когда вы достигнете некоторых специфичных для процессора функций. Это могут быть простые вызовы функций со стеком, некоторые специфические операции ввода-вывода / памяти. Более интересными являются операции с регистром счетчика программ, используемым для вычислений, или с использованием / подсчета тиков / задержек.

Но есть другой способ, если это произойдет. Тоже хардкор :) Существует метод под названием , динамическая перекомпиляция . Он используется во многих эмуляторах .

Вам не нужно перекомпилировать ASM, но идея почти та же. Вы можете использовать все свои #define с первого шага, но добавить к ним поддержку необходимой функциональности (увеличивая PC / Ticks). Также вам нужно добавить некоторую виртуальную среду для вашего кода, такую ​​как менеджеры памяти / ввода-вывода и т. Д.

Удачи :)

3
ответ дан 28 November 2019 в 22:11
поделиться

Я думаю Проще взять книгу по сборке ПОС и научиться читать. Ассемблер, как правило, довольно прост в освоении, так как он очень низкий.

1
ответ дан 28 November 2019 в 22:11
поделиться

Вы не можете детерминированно преобразовать ассемблерный код в C. Прерывания, самомодифицирующийся код и другие низкоуровневые вещи не имеют другого представления, кроме встроенного ассемблера в C Существует лишь некоторая степень, в которой процесс сборки в C может работать. Не говоря уже о том, что результирующий код C, вероятно, будет труднее понять, чем на самом деле читать код сборки ... если вы не используете это как основу для начала повторной реализации кода сборки на C, тогда это отчасти полезно. Попробуйте плагин Hex-Rays для IDA.

8
ответ дан 28 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: