2

混乱しています。私は C++ 開発者ですが、ソース コードが最初にアセンブリに変換され、次にアセンブリがマシン コードに変換されるという話を何度も耳にしました。しかし、アセンブリ言語のビデオ チュートリアルの 1 つで、インストラクターは明確に、C/C++ コードは直接マシン コードに変換されると言いました。(もちろん、そこでリンクとロードが行われます)。

このようなリンクを見 たことがあります。C++ コードはアセンブリ コードにコンパイルされますか?

それでも私は自分の疑問を明確にすることができません。

場合によっては、C++ が最初にアセンブリに変換されない場合、逆アセンブラーがバイナリからアセンブリ コードを生成する方法。

4

2 に答える 2

12

昔の(非常に古い)時代、コンパイラは次のように機能していました。

  1. コンパイラはアセンブリ コードをファイルに生成し、それをディスクに書き込みました。
  2. アセンブラはそのファイルを取得し、バイナリを生成しました。

最近では、本当にアセンブリ出力が必要でない限り、コンパイラは明示的なアセンブリ言語コードを生成しません。メモリ内にアセンブリを生成するだけですが、それをマシンコード自体に変換し、マシンコードのみをファイルに書き込みます。これは、講師が C/C++ が直接マシン コードに変換されると言ったときに意味したことです

知っておくべき重要なことがもう 1 つあります。機械語は基本的にアセンブリ言語と同じものです。アセンブリ言語では、命令には名前があり、文字列で記述されますが、機械語で使用される命令と同じ(1 対 1 のマッピング) です。これは重要なことなので、繰り返しますが、マシンコードとアセンブリは同じで、異なる表記法で書かれているだけです。

これが、どのバイナリも逆アセンブルできる理由です。マシンコードからアセンブリに何かを変換するには、表現を変更するだけで済みます (各命令とそのオペランドをバイナリから「ニーモニック」形式に変換します。

mov rax, 42そのため、最新のコンパイラは、パフォーマンス上の理由から、実際には命令 (例: ) を表す実際の文字列を生成しない場合があります。誰もアセンブリ出力を必要としない場合、メモリとそれを生成する処理能力を無駄にする必要はありません。しかしもちろん、コンパイラが生成するより高速な同等のマシン コードを生成します。

于 2013-06-19T16:28:19.643 に答える
0

マシン コードはアセンブリに直接マッピングされるため、違いを分析することはあまり現実的ではありません。C++ 言語の現状では、動作のみを記述し、実装まではそれが何をするかを説明します。CLI コードや Java バイトコードなどを発行することも可能です。

実際には、ほとんどの実装は実際に最後まで進み、最後にアセンブリ/マシン レベルで最適化されたコードを出力します。また、アセンブリ ソース ファイル (.asm、.s) または注釈付きコード/assy/C++ ソースの出力をサポートします。

于 2013-06-19T16:27:52.267 に答える