単純な C または C++ コード (つまり、入力として int を取り、その int に依存するいくつかの単純な形状を出力として出力する) をアセンブリ言語に何らかの方法で変換することは可能ですか? ない場合は手動で行いますが、Intel 8080 などのプロセッサで行うので、少し面倒に思えました。どうにかしてプロセスを自動化できますか?
また、方法があれば、出力されたアセンブリ ファイルのソース コードは、手動で翻訳する場合と比較して、どの程度優れたものになるでしょうか?
ほとんどのコンパイラでは、アセンブリ出力を生成できます。いくつかの明白な例として、Clang と gcc/g++ は-S
フラグを使用し、MS VC++ は-Fa
フラグを使用してそうしています。
いくつかのコンパイラはこれを直接サポートしていません (たとえば、メモリが Watcom をサポートしていない場合)。このように私が見たものでは、オブジェクト ファイルを生成し、オブジェクト ファイルからアセンブリ言語ファイルを生成する逆アセンブラーを含めました。はっきりとは覚えていませんが、これが Digital Mars コンパイラで必要な処理であったとしても、驚くことではありません。
アセンブリ言語の記述に慣れている人にとって、ほとんどのコンパイラからの出力は通常、少なくとも多少洗練されていないように見える傾向があります。特に、現在では本当に汎用的なレジスタがかなりあるが、歴史的にはより具体的な意味を持っていた x86 のような CPU ではそうです。 . たとえば、コードの一部にポインターとカウンターの両方が必要な場合、ユーザーはおそらくポインターを ESI または EDI に配置し、カウンターを ECX に配置します。コンパイラはそれらを簡単に逆にする可能性があります。これでも問題なく動作しますが、経験豊富なアセンブリ言語プログラマーは、ポインターに ESI を使用し、カウンターに ECX を使用した方が間違いなく読みやすいでしょう。
見てみましょうgcc -S
:
gcc -S hello.c # outputs hello.s file
少なくとも部分的な gcc 互換性を維持する他のコンパイラも、このフラグを受け入れる場合があります。clang
たとえば、LLVMはそうです。
そうですね、そういう番組はありますよね。それは「コンパイラ」と呼ばれます
編集に答えるには:出力の優雅さは、コンパイラの最適化に依存します。通常、コンパイラは、人間が「エレガント」と呼ぶようなコードを生成しません。
(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 ルーチンを開発する必要があります。それは多くの追加作業です。