1

C/C++ コードをコンパイルすると、アセンブリ コードが生成されます。Windows と Linux のデュアル ブート (つまり、まったく同じプロセッサ) を使用していて、Windows と Linux の両方で C++ でプログラムを作成した場合、

コンパイル後(リンク前)のアセンブリコードは同じになりますか?

つまり、実行可能ファイルの違いはリンカーであり、書き込みですか? しかし、私は実行可能ファイルについて話しているのではありません...リンクする前のアセンブリコードについて話しているのです。

両方のアセンブリ コードが異なる場合、なぜ、どのように異なるのでしょうか?

ライブラリはプリコンパイルされているので、それが違いだと思います(そうでない場合は修正してください)。しかし、ライブラリを使用しないとどうなりますか?

4

2 に答える 2

4

OS が異なれば、使用される実行可能ファイル形式も異なります。

また、さまざまな方法で内部的に機能するさまざまな API を介して機能を提供します (fopen()最終的には、32 ビット Windows ではorを使用し、32 ビット Linux では使用を呼び出す予定です) CreateFileA()。そのため、Windows 用と Linux 用のプログラム内に異なるコードが存在します。int 0x2Esysenteropen()int 0x80fopen()

コンパイラが異なれば、デフォルトの呼び出し規約が異なる場合もあれば、同じコンパイラがターゲット OS ごとに異なる呼び出し規約を使用する場合もあります。最適化とデバッグのオプションが異なると、同じコンパイラでもコード生成に影響します。

最後に、ライブラリを使用しなくても、他のすべてが同じ場合でも、コンパイラが異なれば、非常に異なるコードが生成される可能性もあります (これは一般的に無意味なことです)。それは単に、まったく同じアルゴリズムを使用しておらず、同じ人によって書かれていないためであり、すべてのコンパイラが同じように動作することを義務付ける人がいないためです。

とにかく、あなたの質問のポイントは何ですか?

于 2013-02-24T10:45:12.440 に答える
1

The assembly code will be the same, as long as you don't have to use a system call - which means that you cannot read input, nor perform output, not even end the program - nothing.

So, except for a totally useless program that cannot do input and output and that you will have to kill manually you can't create a binary that goes through the same code on several operating systems, doing the same stuff everywhere.

于 2013-02-24T10:18:24.850 に答える