我正在使用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
}
我想知道的是,这些操作码是否是原子性的?也就是说,在一个抢占式调度内核中,一个单独的操作码在执行完成之前是否可能被抢占?这里的操作码可以很容易地映射到汇编指令,几乎是一对一的,因为它们有单独的加载、存储、添加等操作码。但是,对于更复杂的操作码呢?比如 "call",当操作数是一个方法引用标记时,首先应该跟随解析该方法,然后才能调用,这种情况下还是原子性吗?