2012-04-21 14 views
19

Poiché questi codici IL visualizzano di più, mi piace imparare come interpretarli correttamente.Come imparare IL su CLR

non riuscivo a trovare una documentazione come compilatore C# o in qualsiasi altro modo penso di poter praticamente prendersi cura di tutto il resto dopo apprendo questa quelli comuni:

seguito sono riportati alcuni codici IL campione contenente quello che mi serve di sapere:

Esempio 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 

Esempio 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 

So cosa fanno questi codici da quando li ho prodotti :-) tuttavia mi piacerebbe saperne di più sul codice IL corrispondente.

Questi campioni contengono codici IL come e potresti spiegare il comando con punti interrogativi? e anche cosa rappresentano quei comandi? Quindi possiamo memorizzarli facilmente.

  • NOP (per il debug - nessuna operazione)
  • newobj (a quanto pare sta creando nuovo oggetto nella heap)
  • stloc.0?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - costruttore

Capire IL è importante in quanto espone il modo particolare compilatore produce codici e agire in casi specifici.

Tuttavia, non sono riuscito a trovare documenti validi che contengano esempi anche su IL. CLR con C# 3.0 è un buon libro, ma alla fine non è un libro IL, quindi non spiega tutto su IL.

EDIT:

ho trovato le specifiche e dico queste: Grazie a @usr.

  • NOP (per il debug - nessuna operazione)
  • newobj - creare un nuovo oggetto
  • stloc.0 - valore pop dalla pila a variabile locale
  • ldloc.0? - carica la variabile locale nello stack
  • ritorno dal metodo
  • ldarg.0 - Carica argomento 0 nello stack.
  • ldstr - caricare una stringa letterale
  • stfld - negozio in un campo di un oggetto
  • ldc.i4.s - a pressione num nello stack come int32, breve modulo.
  • .ctor - costruttore
+1

fino alla fine degli elettori:.. ho modificato la mia domanda ... – Tarik

+0

ho cambiato il titolo che ho. pensa che questa sia una domanda perfettamente valida – usr

+0

@usr: Grazie per il cambio di titolo, su sembra buono ora – Tarik

risposta

7

Microsoft standardized the CLR and published those standards. La partizione III contiene una grande quantità di informazioni su IL/CIL ed è adatta all'apprendimento. È un documento eccellente.

È inoltre possibile imparare IL tramite l'esempio. Compilare alcuni semplici metodi in C# e guardare l'IL nel reflector (ha una modalità IL).

+0

Questo è quello che ho fatto, ma mi piacerebbe molto anche per quello che rappresentano questi comandi. – Tarik

+0

Sì, ti consiglio di guardare le specifiche allora. La partizione III sembra effettivamente abbastanza buona e comprensibile. – usr

+0

Ho trovato quello che sto cercando in realtà nelle specifiche qui in questo file pdf: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

Se si desidera una breve sinossi di ciascun codice operativo, è possibile fare peggio di ispezionare lo spazio dei nomi System.Reflection.Emit.

Ad esempio, esiste una classe OpCodes con campo statico per ciascun codice operativo. Ognuno di questi viene quindi descritto in maggiore dettaglio, in termini di comportamento dello stack. Per esempio. Ldarg_0:

Il ldarg.0 istruzione spinge l'argomento indicizzati da 0 nello stack di valutazione. L'istruzione ldarg.0 può essere utilizzata per caricare un tipo di valore o un valore primitivo nello stack copiandolo da un argomento in entrata.

8
  • NOP - no-op
  • newobj - creare un oggetto e chiamare il suo costruttore.
  • stloc.0 - Pop un valore dallo stack, e memorizzarlo nella prima variabile locale
  • ldloc.0 - Spingere la prima variabile locale nello stack
  • ret - tornare
  • ldarg.0 - Spingere il primo argomento (this in metodi di istanza) nello stack
  • ldstr - Spingere una stringa nello stack
  • stfld - impostare il campo utilizzando i dati nello stack.
  • ldc.i4.s - Inserire il numero specificato come int.
  • .ctor - costruttore

vi consiglio di trovare una buona fonte di documentazione di questi codici operativi (Wikipedia può essere la migliore, anche se :() La documentazione per System.Reflection.Emit ha una documentazione abbastanza dettagliata. . per codici operativi

e, soprattutto, costruire piccoli programmi ed esaminare l'uscita iL Questo è il modo migliore per imparare