为了教育目的,我学习了一点IL(主要是因为我很好奇底层的'%'会发生什么(原来是REM)并开始离题了......)。为什么在这种情况下使用'br.s'IL操作码?
我写了一个方法,就返回true,打破下来一点,想知道关于“br.s”操作码:
.method public hidebysig static bool ReturnTrue() cil managed
{
// Code size 7 (0x7)
.maxstack 1
.locals init ([0] bool CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
} // End of method Primes::ReturnTrue
ldc.i4.1后栈和stloc上推1 .0将它放置在第0个局部,br.s基本上(据我所知)在IL_0005行做了'goto'到ldloc.0。
这是为什么?为什么没有IL_0004线,所以这可以省略?
没有IL_0004,因为'br.s'是一个双字节指令。我猜你禁用了优化?是的,然后期待奇怪的事情。当你开启优化时你会得到什么? – hvd 2014-10-12 08:51:38
然后它只是推动'1'到堆栈并立即返回。 IL_0000:ldc.i4.1 IL_0001:ret – Apeiron 2014-10-12 08:57:21
在“IL_xxxx”中,xxxx是指令从字节开始偏移的偏移量。 br.s是一个单字节指令(与其余部分一样),它需要一个单字节操作数,这是要跳转到的目标指令。 – 2014-10-12 09:13:23