Подтвердить что ты не робот

Конвертировать ASM в C (не перепроектировать)

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

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

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

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

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

4b9b3361

Ответ 1

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

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 или любой другой промежуточный язык скомпилирован для нового целевого процессора в карманном ящике. Я думаю, что не все из них были сделаны таким образом, но я уверен, что некоторые из них были.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

Да, очень возможно обратное программирование кода ассемблера до хорошего качества C.

Я работаю в MicroAPL, компании, которая производит инструмент Relogix для преобразования кода ассемблера в C. Он упоминался в одном из других сообщений.

Пожалуйста, ознакомьтесь с примерами на нашем веб-сайте:

http://www.microapl.co.uk/asm2c/index.html

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Отъезд: decompiler

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

Ответ 9

Нелегко.

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

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

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

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

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

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

Ответ 10

Я могу сказать с гарантией 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.

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

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

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

Удачи:)

Ответ 11

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

Ответ 12

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

Ответ 13

Отъезд asm2c

Инструмент Swift для преобразования DOS/PMODEW 386 TASM Код сборки в код C