
多くのデバッガーなどを使用して、C++ コードから同等のアセンブリをダンプできることがわかりました。
しかし、バイナリ コードについてはどうでしょうか。実際のマシン命令を構成する各バイト内のビットのフォーマットは、マイクロプログラムを構成する可能性があります (マイクロアーキテクチャにマイクロプログラムがある場合)。
C++ コードの各行を、プログラムのある時点で何らかの方法でマシン コードに変換する必要がある場合 (たとえば、float は C++ で定義されていますが、スタックにプッシュされるまで使用されない可能性があるため、行ごとにすべてのマシン コードに 1:1 で変換されない可能性がありますが、それでも使用されます)、各ステートメントなどをトレースできます。ただし、デバッガーは、個々の命令を占有するビットの構成を出力しません。
各プログラムが CPU 用のフォーマットされたバイト/ビット パターン命令になる場合、書き込んだすべてのコードを回路レベルの実際のビットまで追跡できるはずです (私はそう思います)。
しかし、可能な限り完全な保証のために、出来ますか私がここで説明している範囲でこれを行うにはどうすればよいでしょうか? 最新のデバッガー/ソフトウェアではこの機能は提供されておらず、提供されているものでも各命令のバイナリ表現全体を開発者に明確に提供していないようです。
PS: もちろん、これは、コンパイルされたコードが、意図したアーキテクチャの命令ですぐに実行可能であることを前提としています (解釈された言語や、さらに変換するために別のプログラムを必要とするバイトコードではありません)。
答え1
逆アセンブラを使用して、コンパイルされたバイナリ コードをアセンブリ言語に戻すことができます。これにより、バイナリのみで配布されたソフトウェアを (困難を伴いながらも) 「読み取る」ことができます。
質問のもう 1 つの部分については、CPU が特定のバイナリ命令をどのように実行するかについてより詳細な情報を提供する、ある種のハードウェア デコンパイラが必要なようです。これを行うツールは知りません。おそらく、ハードウェア マニュアルを読んで、頭の中でこの種の分析を行う必要があるでしょう。
答え2
いいえ。
まあ、そうかもしれないが、保証はない。なぜなら、コンパイラに入力されるコードが出力されるコードとほとんど同じになることはないためである。その理由は2つある。人間は効率的なコードを書くのが苦手であり、CPUが処理する必要があるのと同じようにコードについて考えないからだ。このため、コンパイラはソースコードをアセンブリ/バイナリに変換する前に最適化する。これにより、文の順序が変更され、不要な文が削除され、関数全体がインライン化される。
たとえば、次の疑似コードがあるとします。
int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);
完全に削減できる
int x = 16;
優れた最適化コンパイラによって生成されたアセンブリは、ソースとはまったく一致しません。デバッグ時にコンパイラの最適化を無効にする必要があるのは、このためです。すべてのコンパイラの最適化を無効にすると、コンパイラはソース コードと 1 対 1 で一致するアセンブリを出力しようとします。