Я немного поигрался с декомпилятором 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, поскольку у них есть отдельные коды операций для загрузки, сохранения, добавления и т. д.
Но что в случае более сложных кодов операций? таких как «вызов», когда операнд является ссылкой на метод токен, который нужно сначала использовать для разрешения метода, а затем вызвать? Это тоже атомарно?