4

単純な C または C++ コード (つまり、入力として int を取り、その int に依存するいくつかの単純な形状を出力として出力する) をアセンブリ言語に何らかの方法で変換することは可能ですか? ない場合は手動で行いますが、Intel 8080 などのプロセッサで行うので、少し面倒に思えました。どうにかしてプロセスを自動化できますか?

また、方法があれば、出力されたアセンブリ ファイルのソース コードは、手動で翻訳する場合と比較して、どの程度優れたものになるでしょうか?

4

5 に答える 5

10

ほとんどのコンパイラでは、アセンブリ出力を生成できます。いくつかの明白な例として、Clang と gcc/g++ は-Sフラグを使用し、MS VC++ は-Faフラグを使用してそうしています。

いくつかのコンパイラはこれを直接サポートしていません (たとえば、メモリが Watcom をサポートしていない場合)。このように私が見たものでは、オブジェクト ファイルを生成し、オブジェクト ファイルからアセンブリ言語ファイルを生成する逆アセンブラーを含めました。はっきりとは覚えていませんが、これが Digital Mars コンパイラで必要な処理であったとしても、驚くことではありません。

アセンブリ言語の記述に慣れている人にとって、ほとんどのコンパイラからの出力は通常、少なくとも多少洗練されていないように見える傾向があります。特に、現在では本当に汎用的なレジスタがかなりあるが、歴史的にはより具体的な意味を持っていた x86 のような CPU ではそうです。 . たとえば、コードの一部にポインターとカウンターの両方が必要な場合、ユーザーはおそらくポインターを ESI または EDI に配置し、カウンターを ECX に配置します。コンパイラはそれらを簡単に逆にする可能性があります。これでも問題なく動作しますが、経験豊富なアセンブリ言語プログラマーは、ポインターに ESI を使用し、カウンターに ECX を使用した方が間違いなく読みやすいでしょう。

于 2013-11-13T17:56:57.477 に答える
6

見てみましょうgcc -S

gcc -S hello.c # outputs hello.s file

少なくとも部分的な gcc 互換性を維持する他のコンパイラも、このフラグを受け入れる場合があります。clangたとえば、LLVMはそうです。

于 2013-11-13T17:57:12.993 に答える
2

そうですね、そういう番組はありますよね。それは「コンパイラ」と呼ばれます

編集に答えるには:出力の優雅さは、コンパイラの最適化に依存します。通常、コンパイラは、人間が「エレガント」と呼ぶようなコードを生成しません。

于 2013-11-13T17:55:47.387 に答える
0
(by simple I mean: taking some int as input, printing some simple shapes dependent on 
 that int as output) to assembly language?

入力と出力は C または C++ ライブラリによって行われるため、x86 コンパイラの出力を見ることはあまり役に立ちません。8080 にはそのようなライブラリがないため、特定のハードウェア用に独自の I/O ルーチンを開発する必要があります。それは多くの追加作業です。

于 2013-11-13T18:43:00.017 に答える