28

私がグーグルで検索したところ、そのような質問をした質問者を基本的に笑っている驚くべき量の軽薄な回答が見られます。

Microchip は、いくつかのソース コードを無料で提供しています (それがダメな場合に備えて、ここに投稿したくありません。基本的には、Google AN937 で最初のリンクをクリックすると、「ソース コード」とその圧縮ファイルへのリンクがあります)。それは ASM にあり、それを見ると斜視になり始めます。従うことができるように、それをacタイプの言語に似たものに変換したいと思います。次のような行のため:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

おそらく非常に単純ですが、私には何の意味もありません。

自動化された ASM から C へのトランスレータがあるかもしれませんが、私が見つけることができるのは、それは不可能だと言っている人だけです。率直に言って、それが不可能であることは不可能です。どちらの言語にも構造があり、その構造は確実に翻訳できます。

4

13 に答える 13

44

アセンブラから絶対にacプログラムを作ることができます。問題は、あなたが考えているように見えないかもしれない、あるいはそうなるかもしれないということです. 私のPICは錆びていますが、別のアセンブラを使用しています。

add r1,r2

Cでは、それは

r1 = r1 + r2;

おそらくより読みやすい。おそらく、値がメモリからレジスタにジャンプして戻ったり、レジスタが再利用されたりするため、変数名の意味が失われます。2 つのレジスタがアキュムレータと別のレジスタを持っていた古い写真について話している場合、変数はほとんどの部分でメモリ内にあったため、実際には簡単かもしれません。アドレスを見ると、次のようになります。

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

長くて引き出されていますが、mem[0x12] = mem[0x12] + mem[0x13]; であることは明らかです。

これらのメモリ位置は、一連のレジスタを持つプロセッサ用にコンパイルされた C コードのように飛び回らない変数である可能性があります。写真を使用すると、変数を見つけやすくなり、検索と置換を行ってファイル全体で変数に名前を付けることが容易になる場合があります。

あなたが探しているものは静的バイナリ変換と呼ばれ、必ずしもあるバイナリから別のバイナリへの変換 (あるプロセッサから別のプロセッサへ) ではありませんが、この場合は pic バイナリから C への変換です。アプリケーション ノートを作成し、マイクロチップ ツールを使用してバイナリにアセンブルし、翻訳を行います。動的なバイナリ変換も実行できますが、それらのいずれかを見つける可能性はさらに低く、通常は C ではなく、1 つのバイナリから別のバイナリに変換されます。ウォルマートにある 15 ドルのジョイスティックとパックマンとガラガがどのように機能するのか疑問に思ったことはありませんか? アーケードの rom は、静的バイナリ変換を使用して変換され、最適化およびクリーンアップされ、ハンドヘルド ボックス内の新しいターゲット プロセッサ用にコンパイルされた C または任意の中間言語が使用されました。

百万ドルの質問ですが、写真の静的バイナリ トランスレータを見つけることができますか? おそらく、自分で作成する必要があります。逆アセンブラを作成し、add r0,r1 のようなネイティブ アセンブラ構文の命令に逆アセンブルする代わりに、逆アセンブラに r0=r0+r1; を出力させます。この逆アセンブラを終了する頃には、pic アセンブリ言語をよく知っているので、asm から C へのトランスレータは必要ありません。ニワトリが先か卵が先かの問題です。

于 2009-09-04T02:20:06.987 に答える
22

コンパイルされたプログラムからまったく同じソースコードを取り戻すことは基本的に不可能です。しかし、逆コンパイラーはコンピューターサイエンスの研究分野です(たとえば、博士号プロジェクトであったdcc逆コンパイラー)。

アセンブリコードでパターンマッチングを実行し、同等のCコードを生成するために使用できるさまざまなアルゴリズムがありますが、すべての入力で適切に機能する一般的な方法でこれを実行することは非常に困難です。

一般化された逆コンパイラーでの半最近のオープンソースの取り組みについては、Boomerangをチェックすることをお勧めします。

于 2009-09-04T02:02:07.557 に答える
8

アセンブリ コードを決定論的に C に変換することはできません 。割り込み、自己変更コード、およびその他の低レベルのものは、C のインライン アセンブリ以外の表現はありません。C プロセスへのアセンブリが機能する範囲は限られています。言うまでもなく、結果の C コードは、実際にアセンブリ コードを読むよりもおそらく理解するのが難しいでしょう...これをベースとして C でアセンブリ コードの再実装を開始する場合を除き、それは多少役に立ちます。IDA の Hex-Rays プラグインを確認してください。

于 2009-11-17T01:57:09.890 に答える
8

私はかつて、知的財産の大部分が x86 アセンブリ コードでコード化された本格的なアルゴリズムであるプロジェクトに携わっていました。コードを組み込みシステムに移植するために、そのコードの開発者 (私ではありません) は、MicroAPL と呼ばれる組織のツールを使用しました (私の記憶が正しければ):

このツールの機能の良さに、私は非常に驚きました。

一方で、「頼まなきゃ買えない」タイプの1つだと思います(プロジェクトの1回限りの変換の価格帯は、約4ラインのアセンブリが処理されますドルで)。

しかし、多くの場合、ベンダーから入手したアセンブリ ルーチンは、C から呼び出すことができる関数としてパッケージ化されています。そのため、ルーチンが (使用したいプロセッサ上で) 必要な処理を実行する限り、それらをアセンブルして、多かれ少なかれそれらを忘れてください-それらはCから呼び出す単なるライブラリ関数です.

于 2009-09-04T04:54:23.263 に答える
7

はい、アセンブラ コードを高品質の C にリバース エンジニアリングすることは非常に可能です。

私は、アセンブラー コードを C に変換する Relogix というツールを作成している MicroAPL で働いています。

当社の Web サイトで例をご覧ください。

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

于 2010-10-27T15:48:46.623 に答える
7

自動化された ASM から C へのトランスレータが存在するはずですが、私が見つけることができるのは、それは不可能だと言っている人だけです。率直に言って、それが不可能であることは不可能です。

いいえ、ちがいます。コンパイルによって情報が失われます。最終的なオブジェクト コードには、C ソース コードよりも情報が少なくなります。逆コンパイラは魔法のようにゼロからその情報を作成することはできないため、真の逆コンパイルは不可能です。

于 2009-09-04T01:53:12.460 に答える
4

それは不可能ではありません、ただ非常に難しいです。熟練したアセンブリとCプログラマーがおそらくそれを行うことができます。あるいは、逆コンパイラーの使用を検討することもできます。これらのいくつかは、asmをCに変換するのに非常に優れていますが、おそらくいくつかの変数とメソッドの名前を変更する必要があります。

x86アーキテクチャで利用可能な逆コンパイラのリストについては、このサイトをチェックしてください。

于 2009-09-04T02:03:07.073 に答える
4

簡単にはできません。

読みやすさ以外のASMに対するCの大きな利点の1つは、「巧妙な」プログラミングトリックを防ぐことでした。

アセンブラで実行できることはたくさんありますが、Cに直接相当するものがないか、Cで曲がりくねった構文が含まれています。

もう1つの問題は、ほとんどのアセンブラが本質的に交換可能なデータ型がバイトとワードの2つしかないデータ型です。intsやfloatなどを定義するためのいくつかの言語構造があるかもしれませんが、メモリが定義どおりに使用されていることを確認する試みはありません。そのため、ASMストレージをCデータ型にマッピングすることは非常に困難です。

さらに、すべてのアセンブラストレージは本質的に「構造体」です。ストレージは、定義された順序でレイアウトされます(ストレージが実行時の気まぐれで順序付けられるCとは異なります)。多くのASMプログラムは、正確なストレージレイアウトに依存しています。Cで同じ効果を得るには、すべてのストレージを単一の構造体の一部として定義する必要があります。

また、多くの乱用された命令があります(古い世界的なIBMマンフレームでは、LA、ロード・アドレス、命令は、より高速でオーバーフロー・レジスターを必要としなかったため、単純な算術を実行するために定期的に使用されていました)

技術的にはCに変換することは可能かもしれませんが、結果のCコードは、変換されたASMコードよりも読みにくくなります。

于 2009-09-04T02:11:09.813 に答える
3

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 のみで変換できると思います。

CPU 固有の機能に到達すると、楽しみが始まります。これは、スタック操作、いくつかの特定の IO/メモリ操作を伴う単純な関数呼び出しである場合があります。より楽しいのは、計算に使用されるプログラム カウンター レジスターの操作、またはティック/レイテンシーの使用/カウントです。

しかし、このハードコアが発生した場合、別の方法があります。それもハードコアです:)動的再コンパイルという手法が存在します。多くのエミュレータで使用されています。

ASM を再コンパイルする必要はありませんが、考え方はほとんど同じです。最初のステップからすべての #defines を使用できますが、それらに必要な機能のサポートを追加します (PC/Ticks を増やします)。また、メモリ/IO マネージャーなど、コード用の仮想環境を追加する必要があります。

幸運を :)

于 2009-09-18T08:56:20.127 に答える
3

これをチェックしてください:逆コンパイラ

逆コンパイラは、コンパイラの逆の操作を実行するコンピュータ プログラムに付けられた名前です。つまり、比較的低いレベルの抽象化 (通常は人間が読めるというよりもコンピューターが読み取れるように設計されている) の情報を含むファイルを、より高いレベルの抽象化を持つ形式 (通常は人間が読み取れるように設計されている) に変換します。

于 2009-09-04T01:59:55.717 に答える
1

PIC アセンブリに関する本を手に取り、それを読むことを学ぶ方が簡単だと思います。アセンブラは非常に低レベルであるため、一般に習得が非常に簡単です。

于 2009-09-18T13:09:49.250 に答える
0

関数を asm から C に変換するのは困難ですが、手動で実行できます。プログラム全体を逆コンパイラで変換すると、コンパイル中に構造の多くが失われるため、理解できないコードが得られます。意味のある変数名と関数名がなければ、結果の C コードは依然として非常に理解しにくいものです。

基本的なプログラムの C コンパイラの出力 (特に最適化されていない出力) は、パターンと構造が繰り返されるため、C に変換できる可能性があります。

于 2009-09-08T05:48:37.480 に答える