2016-06-21 58 views
0

這個符號是什麼(IL_0000等)在IL代碼中。它這是真正的內存堆地址?什麼是IL代碼中的那些符號?

IL_0000: nop 
    IL_0001: ldstr  "here is something" 
    IL_0006: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000b: nop 
    IL_000c: ldc.i4.s 18 
    IL_000e: newobj  instance void Proj.Stock::.ctor(int32) 
    IL_0013: stloc.0 
    IL_0014: ldstr  "another" 
    IL_0019: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_001e: nop 
    IL_001f: ldstr  "and even more" 
    IL_0024: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_0029: nop 
    IL_002a: ret 

回答

3

IL_0000:是一個代碼標籤。這實際上只是一個標識符,因此您可以通過名稱而不是字節數輕鬆地引用跳轉位置。

請參閱公共語言基礎結構(CLI)標準文檔。 ECMA-335部II.5.4

II.5.4標籤和標籤

標籤被設置爲編程方便的升派;它們代表在元數據中編碼的 號碼。由 標籤表示的值通常是從當前方法的起始處開始的偏移量,儘管精確編碼根據 而不同,其中在邏輯元數據結構或CIL流中標籤 發生在 處。

...

+1

它也有顯示你每一個指令的大小(因爲數字是相對地址)的有趣的副作用。 –

+0

真的......如果你使用的是ILDASM ......但這不是必需的。 –

+0

@FrédéricHamidi - 所以在'IL_0001'這個標籤上,它在字符串''ldstr'上做'是'。下一個標籤是'IL_0006'。然而,'這裏有東西'的長度是17個字符,並且存儲爲unicode(每個字符2個字節),即34個字節。那麼下一個標籤不應該是'IL_0023'(十六進制35)? – Icemanind