2012-04-21 3 views
19

これらのILコードは私がもっと見るものをコードするので、正しく解釈する方法を学ぶのが好きです。CLRでILを学ぶ方法

私はので、私は、私はこの一般的なものを学ぶの後、私はかなり残りの世話をすることができると思いますC#コンパイラなどのドキュメントや他のを見つけることができませんでした:

以下

は私が必要なものを含むいくつかのサンプルILコードです知っている:

サンプル1:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  15 (0xf) 
    .maxstack 1 
    .locals init ([0] class EnumReflection.DerivedClass derivedClass) 
    IL_0000: nop 
    IL_0001: newobj  instance void EnumReflection.DerivedClass::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput() 
    IL_000d: nop 
    IL_000e: ret 
} // end of method Program::Main 

サンプル2:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  38 (0x26) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldstr  "Hello" 
    IL_0006: stfld  string EnumReflection.DerivedClass::hello 
    IL_000b: ldarg.0 
    IL_000c: ldstr  "World" 
    IL_0011: stfld  string EnumReflection.DerivedClass::world 
    IL_0016: ldarg.0 
    IL_0017: ldc.i4.s 123 
    IL_0019: stfld  int32 EnumReflection.DerivedClass::age 
    IL_001e: ldarg.0 
    IL_001f: call  instance void EnumReflection.BaseClass::.ctor() 
    IL_0024: nop 
    IL_0025: ret 
} // end of method DerivedClass::.ctor 

私はこれらのコードを私が製作して以来知っています:-)しかし、私は対応するILコードについてもっと学びたいと思います。

これらのサンプルには、のようなILコードが含まれています。疑問符でコマンドを説明してください。それらのコマンドは何を表していますか?だから私たちはそれらを簡単に覚えることができます。

  • NOP(デバッグのために - 操作なし)
  • NEWOBJ
  • stloc.0(ヒープ内の新しいオブジェクトを作成しているようですか)?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - それはコンパイラが特定のケースでコードや行為をどのように生成するか、特定の公開してコンストラクタ

ILを理解することが重要です。

しかし、ILについての例も含まれている素晴らしいドキュメントは見つかりませんでした。 C#3.0のCLRは良い本ですが、最終的にILの本ではありませんので、ILについてすべてを説明するわけではありません。

EDIT:

私はスペックを見つけたと、彼らはこれらの教え:おかげで@usrします。 (デバッグのために - 操作なし)

  • NOP
  • NEWOBJ - 新しいオブジェクト
  • stloc.0作成 - ローカル変数にスタックからポップ値を
  • ldloc.0? - スタックにローカル変数をロードする
  • メソッドから戻る -
  • ldarg.0 - 引数0をスタックにロードします。
  • ldstr - リテラル文字列
  • stfldをロード - INT32、ショートフォームとしてスタックにプッシュNUM - オブジェクト
  • ldc.i4.sのフィールドに格納します。
  • .ctor - コンストラクタ
+1

:。。私はタイトルを変更し – Tarik

+0

...私の質問を編集した私は。これは完全に有効な質問だと思います。 – usr

+0

@usr:タイトル変更ありがとうございます今よく見える。 – Tarik

答えて

7

Microsoft standardized the CLR and published those standards。パーティションIIIにはIL/CILに関する豊富な情報が含まれており、学習に適しています。それは素晴らしい文書です。

ILを例として学習することもできます。 C#でいくつかの簡単なメソッドをコンパイルし、リフレクタのILを見ます(ILモードがあります)。

+0

それは私がやったことですが、私はこれらのコマンドも何を意味するのが大好きです。 – Tarik

+0

はい、スペックを調べることをおすすめします。パーティションIIIは、実際にはかなり良く見えます。 – usr

+0

私はこのpdfファイルのspecsで実際に探しているものを見つけました:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

各オペコードの簡単な概要を知りたい場合は、System.Reflection.Emit名前空間を調べるよりも悪い可能性があります。

たとえば、各オペコードに静的フィールドを持つOpCodesクラスがあります。これらのそれぞれについて、スタックの振る舞いの観点から、さらに詳しく説明します。例えば。 Ldarg_0

ldarg.0命令が評価スタックに0でインデックスさ引数を押します。 ldarg.0命令を使用して、値の型またはプリミティブの値を入力引数からコピーすることによってスタックにロードすることができます。

8
  • NOP - ノーオペレーション
  • NEWOBJ - オブジェクトを作成し、そのコンストラクタを呼び出します。
  • stloc.0 - スタックから値をポップし、第1のローカル変数
  • ldloc.0に保管 - リターン
  • ldarg.0 - スタック
  • RET上に第一のローカル変数をプッシュ -
  • ldstr - 文字列をスタックにプッシュ
  • stfld - スタック上のデータを使用してフィールドを設定します。
  • ldc.i4.s - 指定された数値をintとしてプッシュします。
  • .ctor - コンストラクタ

私はあなたがSystem.Reflection.Emitのドキュメントはかなり詳細なドキュメントを持っている(ただし:(ウィキペディアは最高でもよい)これらのオペコードのドキュメントの良い情報源を見つけることをお勧めします。 。近い有権者へ

そして、上記のすべてのオペコードのために、小さなプログラムを構築し、IL出力を確認することを学ぶための最良の方法である

関連する問題