爲了教育目的,我學習了一點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