0

x86アセンブリに関するこのチュートリアルに従っています。これまでのすべての例では、「初期化」の手段として、アセンブリモジュールでコンパイルされた「c-driver」プログラムと呼ばれるものを使用しています。何かのようなもの:

int main(void) {
  int ret = asm_main();
  return ret;
}

そして、asm_main関数は、C呼び出し規約を使用して通常どおりに記述されます。Cコンパイラによって生成されている必要な初期化とは正確には何であり、移植可能な方法で実行できるかどうか疑問に思っています。

情報:私はWindows XP、32ビットボックスを使用しており、リンクにNASMアセンブラとmingw32-gccを使用しています。

4

3 に答える 3

6

初期化はcコンパイラによって生成されるのではなく、cライブラリの一部です(これにより、各OS /プロセッサの調整が容易になります)。

問題のコードは通常、Windows / Unixシステムでは非常に単純です。通常、ライブラリの初期化を少し行い(STDIN、STDOUT、STDERRを開き、タイムゾーンを設定します)、環境を設定し、mainに渡すためのコマンドラインを処理します。main()からの戻りをキャッチし、exitなどを呼び出します。

ほとんどのcライブラリの起動コードは、crt0.c、crt1.c、または同様のファイル(crt = cランタイム)にあります。

よりプリミティブなシステムやベアシステムでは、スタックやその他のレジスタをセットアップし、BSSデータ領域をクリアします。この場合、多くの場合、アセンブラ(通常はcrt0.S)にあります。

BSDcスタートアップコードへのリンクは次のとおりです-リンクテキスト

そして、Windows用のmingwの起動コードはここのcrt1.cにあります-http ://mingw.cvs.sourceforge.net/viewvc/mingw/runtime/

于 2009-11-12T20:50:57.023 に答える
0

必要に応じて、メインをアセンブリで記述できます。しかし、多くの人がデバッグステートメントをメインに配置したいと考えており、それらはasmよりもCの方が簡単です。

mainをasmで記述した場合、mainが実際に_mainと呼ばれるか、別の呼び出し規約(特に、Windowsの場合)を使用するか、Cコンパイラが関数のコードを生成するときに自動的に処理するような他の奇妙なことを処理する必要があります。名前「メイン」。この方法でそれができるので、あなたもそれをする必要はありません。

于 2009-11-12T21:06:50.217 に答える
0

main()を呼び出す前に、スタック、レジスタ、およびプログラムのファイルセクション(data、rodata、bssなど)を初期化する必要があります。Cランタイムライブラリ(CRT)は、この初期化を提供します。

CRTは、各関数が呼び出される前後に実行されるプロローグおよびエピローグコードも提供します。プロローグとエピローグのコードは、スタックとフレームのポインターを更新します。

于 2009-11-13T03:30:48.320 に答える