Как узнать 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.Ноль ?
  • рет ?
  • ldarg.0 ?
  • ldstr ?
  • stfld ?
  • ЛДЦ.и4.s ?
  • .конструктор - конструктор

понимание IL важно, поскольку оно раскрывает, как конкретный компилятор производит коды и действует в конкретных случаях.

тем не менее, я не мог найти хорошие документы, которые содержат примеры, а также о IL. CLR с C# 3.0-хорошая книга, но в конечном итоге это не книга IL, поэтому она не объясняет все об иле.

EDIT:

Я нашел спецификации, и они говорят следующее: спасибо @usr.

  • nop (для отладки - нет операции)
  • newobj - создать новый объект
  • stloc.0-значение pop из стека в локальную переменную
  • ldloc.0 ? - загрузите локальную переменную в стек
  • ret-return from method
  • ldarg.0 - загрузить аргумент 0 на стек.
  • ldstr-загрузить строку литерала
  • stfld-хранить в поле объекта
  • ЛДЦ.и4.S-нажмите num на стек как int32, короткая форма.
  • .конструктор - конструктор

4 ответов


Microsoft стандартизировала CLR и опубликовала эти стандарты. Раздел III содержит богатую информацию о IL / CIL и подходит для обучения. Это отличный документ.

вы также можете узнать IL на примере. Скомпилируйте несколько простых методов в C# и посмотрите на IL в reflector (он имеет IL-режим).


есть несколько книг, которые охватывают IL:

также некоторых книги по реинжиниринг есть разделы по IL.

Смотрите также:


  • nop-no-op
  • newobj-создайте объект и вызовите его конструктор.
  • stloc.0-Pop значение из стека, и сохранить его в первой локальной переменной
  • ldloc.0-вставьте первую локальную переменную в стек
  • ret-return
  • ldarg.0-Нажмите первый аргумент (this в методах экземпляра) в стек
  • ldstr-вставьте строку в стек
  • stfld-установить поле, используя данные стек.
  • НРС.и4.S-нажмите указанное число как int.
  • .конструктор - конструктор

я рекомендую вам найти хороший источник документации по этим кодам (Википедия может быть лучшей, хотя: (). Документация для системы.Отображение.Emit имеет довольно подробную документацию для opcodes.

и прежде всего, создайте небольшие программы и изучите выход IL. Это лучший способ учиться.


Если вы хотите краткий обзор каждого кода операции, вы можете сделать хуже, чем проверка System.Reflection.Emit пространство имен.

например, есть OpCodes класс, который имеет статическое поле для каждого кода операции. Каждый из них затем описывается более подробно, с точки зрения его поведения стека. Е. Г. Ldarg_0:

на ldarg.0 инструкция помещает аргумент, индексированный на 0, в стек оценок. Этот ldarg.0 инструкция может использоваться для загрузки типа значения или примитивного значения в стек путем копирования его из входящего аргумента.