Являются ли коды операций MSIL атомарными?

Я немного поигрался с декомпилятором MSIL - ILDASM, и я попытался декомпилировать простой метод .NET.

коды операций выглядели примерно так:

.method private hidebysig static int32  Add(int32 a,
                                            int32 b) cil managed
{
  // Code size       18 (0x12)
  .maxstack  2
  .locals init ([0] int32 c,
           [1] int32 d,
           [2] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.5
  IL_0003:  add
  IL_0004:  stloc.0
  IL_0005:  ldarg.1
  IL_0006:  ldc.i4.s   10
  IL_0008:  add
  IL_0009:  stloc.1
  IL_000a:  ldloc.0
  IL_000b:  ldloc.1
  IL_000c:  add
  IL_000d:  stloc.2
  IL_000e:  br.s       IL_0010
  IL_0010:  ldloc.2
  IL_0011:  ret
}

Меня интересует, являются ли эти коды операций атомарными? т.е. в ядре с приоритетным планированием возможно ли вытеснение одного кода операции до того, как он завершит выполнение? сопоставлены с инструкциями asm примерно 1: 1, поскольку у них есть отдельные коды операций для загрузки, сохранения, добавления и т. д.

Но что в случае более сложных кодов операций? таких как «вызов», когда операнд является ссылкой на метод токен, который нужно сначала использовать для разрешения метода, а затем вызвать? Это тоже атомарно?

9
задан Karim Agha 31 January 2012 в 19:56
поделиться