2012-04-21 10 views
19

Dado que estos códigos IL lo que veo más, me gusta aprender a interpretarlos correctamente.Cómo aprender IL en el CLR

no pude encontrar una documentación como el compilador de C# o cualquier otro, así que creo que puedo tener más o menos el cuidado del resto después de aprender esto de las más comunes:

A continuación se presentan algunos códigos IL muestra que contienen lo que necesito a saber:

Muestra 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 

Muestra 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 

Sé lo que hacen estos códigos desde que los produje :-) Sin embargo, me gustaría obtener más información sobre el código IL correspondiente.

Estas muestras contienen códigos IL como, y ¿podría explicar el comando con signos de interrogación? y también, ¿qué significan esos comandos? Entonces podemos memorizarlos fácilmente.

  • nop (para la depuración - ninguna operación)
  • newobj (parece que está creando nuevo objeto en el montón)
  • stloc.0?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - constructora

La comprensión de IL es importante ya que expone la forma en particular, compilador produce códigos y actuar en casos específicos.

Sin embargo, no pude encontrar buenos documentos que también contengan ejemplos sobre IL. CLR con C# 3.0 es un buen libro, pero finalmente no es un libro de IL, por lo que no explica todo sobre IL.

EDIT:

he encontrado las especificaciones y que diga que éstos: Gracias a @usr.

  • nop (para la depuración - ninguna operación)
  • newobj - crear un nuevo objeto
  • stloc.0 - valor de chasquido de la pila a la variable local
  • ldloc.0? - carga la variable local en la pila
  • ret - devuelve del método
  • ldarg.0 - Cargue el argumento 0 en la pila.
  • ldstr - cargar una cadena literal
  • stfld - tienda en un campo de un objeto
  • ldc.i4.s - num empuje en la pila como int32, forma corta.
  • .ctor - constructora
+1

para el cierre del votante:.. he editado mi pregunta ... – Tarik

+0

he cambiado el título I. Creo que esta es una pregunta perfectamente válida. – usr

+0

@usr: Gracias por el cambio de título, es su Se ve bien ahora. – Tarik

Respuesta

7

Microsoft standardized the CLR and published those standards. La Partición III contiene una gran cantidad de información sobre IL/CIL y es adecuada para el aprendizaje. Es un excelente documento.

También puede aprender IL por ejemplo. Compile algunos métodos simples en C# y mire la IL en el reflector (tiene un modo IL).

+0

Eso es lo que hice sin embargo, me encantaría lo que estos comandos representan también. – Tarik

+0

Sí, le recomiendo que busque en la especificación entonces. Partición III en realidad se ve bastante bien y comprensible. – usr

+0

He encontrado lo que estoy buscando en realidad en las especificaciones aquí en este archivo pdf: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

Si desea una breve sinopsis de cada código de operación, podría hacer algo peor que inspeccionar el espacio de nombre System.Reflection.Emit.

Por ejemplo, hay una clase OpCodes que tiene un campo estático para cada código de operación. Cada uno de estos se describe con más detalle, en términos de su comportamiento de pila. P.ej. Ldarg_0:

El ldarg.0 instrucción empuja el argumento indexado a 0 en la pila de evaluación. La instrucción ldarg.0 se puede utilizar para cargar un tipo de valor o un valor primitivo en la pila copiándolo de un argumento entrante.

8
  • nop - no-op
  • newobj - crear un objeto y llamar a su constructor.
  • stloc.0 - Pop un valor de la pila, y almacenarlo en la primera variable local
  • ldloc.0 - Empuje la primera variable local en la pila
  • ret - volver
  • ldarg.0 - empuje el primer argumento (this en los métodos de instancia) en la pila
  • ldstr - empujar una cadena en la pila
  • stfld - establecer el campo, a partir de datos en la pila.
  • ldc.i4.s - Presione el número especificado como int.
  • .ctor - constructora

le recomiendo que encontrar una buena fuente de documentación sobre estos códigos de operación (Wikipedia puede ser la mejor, aunque :() La documentación para System.Reflection.Emit tiene documentación bastante detallada. . de códigos de operación

y, sobre todo, crear pequeños programas y examine la salida IL Esa es la mejor manera de aprender