程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 讀懂IL代碼(四),讀懂il代碼

讀懂IL代碼(四),讀懂il代碼

編輯:C#入門知識

讀懂IL代碼(四),讀懂il代碼


 這一篇是IL系列的最後一篇的,主要是要說一下IL中的流程控制。我相信,經過前面三篇的介紹,看IL代碼應該不是什麼大問題了吧。好吧,閒話不多說了,就來簡單的說一下吧。

還是跟前幾篇一樣,以例子來解釋說明。

轉換為IL代碼如下:

 

大家是否看到了上圖中我畫的紅色框框,這個就是流程控制的關鍵,下面我最後一次一句一句去解釋,希望大家能夠自己去嘗試一下,看一下。

.method private hidebysig static void Main(string[] args)cilmanaged
{
    .entrypoint //代表該函數程序的入口函數
    .maxstack 2 //評估棧可容納數據項的最大個數
    .locals init (
        [0] int32 num, 
        [1] bool flag) //聲明兩個變量,第一個是int類型,第二個是bool類型
    L_0000: nop //No Operation
    L_0001: ldc.i4.2 //把數值2以4字節長度整數的形式壓入評估棧
    L_0002: stloc.0  //把評估棧棧頂的值彈出,並賦值給第0個局部變量num,等於i=2的C#代碼
    L_0003: ldloc.0  //把第0個變量壓入評估棧,即把變量num壓入評估棧
    L_0004: ldc.i4.0 //把數值0以4字節長度整數的形式壓入評估棧
    L_0005: cgt  //執行大於指令操作,比較num和0,結果存儲在評估棧棧頂,1表示真,即i>0為真
    L_0007: stloc.1 //把大於指令的運算結果從評估棧彈出,並賦值給第1個變量flag
    L_0008: ldloc.1 //把第1個變量壓入評估棧,即把變量flag壓入評估棧
    L_0009: brfalse.s L_001a //如果brfalse為false,空引用或0,將控制轉移到目標指令。在這裡,因為i>0是為真,所以按順序執行,不必跳到L_001a.
    L_000b: nop //No Operation
    L_000c: ldstr "i\u4e3a\u6574\u6570" //把字符串“i為整數”壓入評估棧
    L_0011: call void [mscorlib]System.Console::WriteLine(string)//調用WriteLine方法。
    L_0016: nop 
    L_0017: nop 
    L_0018: br.s L_0027 //無條件地將控制轉移到目標指令(短格式)。轉移到調用ReadKey方法。
    L_001a: nop 
    L_001b: ldstr "i\u4e3a\u8d1f\u6570"//把字符串“i為負數”壓入評估棧
    L_0020: call void [mscorlib]System.Console::WriteLine(string)//調用WriteLine方法。
    L_0025: nop 
    L_0026: nop 
    L_0027: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
    L_002c: pop //清空評估棧的內容
    L_002d: ret

好喽,這樣就完整了噢。一般常用的指令都有說明。如果你在平時遇到了不懂的指令,可以到這裡看看(IL指令),Ctrl+F一下,你就應該知道了。

其實我也是一名初學者,如果有什麼問題的話,希望大家也可以提出來,我會進行改進。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved