[原創]深入C#核心 IL組合語言 (1) by Eddy

來源:互聯網
上載者:User

首先 我們先瞭解下幾個名詞

CLR : Common Language Runtime 公用語言運行庫

它在.Net應用程式和底層作業系統之間提供了一個操作層。這個操作層可供.Net應用程式使用的運行時環境。

打個比方 我們要寫c語言的時候,c語言會編譯成組合語言,組合語言在去編譯成機器語言Cpu指令執行,那麼組合語言就類似於這個CLR,但這個比喻僅僅是比喻,供大家簡單理解CLR,區別實際上CLR並不是解譯器。

CLS : Common Language Specification 公用語言運行規範

它保證了.Net應用程式的互通性,被稱為公用語言運行規範,CLS限制了命名規範、資料類型、函數類型以及某些其他元素,為不同語言提供了一個公用標準。

打個比方 我們在VB.Net裡命名MyField和Myfield、myfield其實是一個變數,不區分大小寫並可以寫在類的外全域變數。但C#卻不可以。這個就是規範乾的事,不同語言有不同的規範,C#,VB.Net ,F# ,J# ,等.Net大家族每個成員都有其規範,最後規範解釋過後,會編譯相同的語種,至於這個語種是什麼,呵呵,你知道的。

CLI : Common Language Infrastrucure 通用語言基礎結構

它是ECMA國際化和ISO標準的一部分描述,描述了其語言基礎結構。

metadata : 中繼資料

managed code : Managed 程式碼

上面兩個皆為CLR的組成部分。

中繼資料  是應用程式所有結構項 類、類成員、類特性、全域項等的描述符及它們的關係所組成的一套系統。

Managed 程式碼  表示了應用程式的方法功能,他們以微軟中繼語言或通用中間語言的抽象二進位形式進行編碼。好了,終於,我們拋出了此文的中心:

MSIL : Microsoft intermediate language 微軟中繼語言

CIL : common intermediate language 通用中間語言

它們統稱 IL 中繼語言。

 

IL代碼由CLR 幫忙“託管” 。CLR託管至少包括三個主要的活動:類型控制、結構化異常處理和垃圾收集。

類型控制  涉及在執行期間項類型的驗證和轉換。

託管異常處理 在功能上與 非託管的結構化異常處理類似,但它是由CLR執行的而不是由作業系統執行的。

垃圾收集 涉及對不再使用的對象進行自動標識和釋放。(當然 智慧型裝置 除外,暫時沒有垃圾收集功能)

在CLR環境下,.Net應用程式由一個或多個託管可執行體組成,其中每一個都攜帶著中繼資料和Managed 程式碼,Managed 程式碼是可選的,但至少要帶有中繼資料,如果都沒有。那你寫這個就可以去吃屎了。託管的.Net應用程式稱為程式集。託管的可執行體稱為Module。每個程式集包含一個主模組,這個模組是什嗎?呵呵,你知道的。

託管可執行體的兩個主要組件:中繼資料和IL代碼。CLR處理這兩個組件的主要子系統是載入程式(loader)和JIT(just-in-time 即時)編輯器。

 

好了,打的手都酸了,在打下去浪費饅頭,現在給大家講講IL吧,上面的不是廢話,提供你IL的背景思想。

 

代碼

.assembly extern mscorlib { auto }
.assembly AndCount { }
.module andCount.exe
.namespace AndCount {
    .class public AndCount extends [mscorlib]System.Object{
        .method public static void AddCount() cil managed {
            .entrypoint
            .locals init (int32 retValue)
        .try{
        AskAfterNum:

            ldstr "-------------------------------------------------------\n加法載入"
            call void [mscorlib]System.Console::Write(string)
            ldstr "\n請輸入第一個數字:"
            call void [mscorlib]System.Console::Write(string)
            call string [mscorlib]System.Console::ReadLine()
            call int32 [mscorlib]System.Convert::ToInt32(string)
            ldstr "\n請輸入第二個數字:"
            call void [mscorlib]System.Console::Write(string)
            call string [mscorlib]System.Console::ReadLine()
            call int32 [mscorlib]System.Convert::ToInt32(string)
            add
            stloc retValue
            ldloc retValue
            brfalse Error
            ldstr "計算完畢,結果為"
            call void [mscorlib]System.Console::WriteLine(string)
            ldloc retValue
            br PrintCount
        Error:
            ldstr "error"
        PrintCount:
            call void [mscorlib]System.Console::WriteLine(int32)
            ldloc retValue
            brtrue AskAfterNum
            }
            catch [mscorlib]System.Exception
            {
                pop
                ldstr "\n臨時錯誤!\n"
                call void [mscorlib]System.Console::Write(string)
                br AskAfterNum
            }
            ret
        }
    }
}
.field public static valuetype CharArray8 Format at FormatData
.data FormatData = bytearray(25 64 00 00 00 00 00 00)
.class public explicit CharArray8
    extends [mscorlib]System.ValueType { .size 8 }
.method public static pinvokeimpl("msvcrt.dll" cdecl)
    vararg int32 sscanf(string,int8*) cil managed{ }

 

 

將其儲存為test.il,並儲存編譯後執行

例如 儲存在D:\test.il 開啟cmd 執行ilasm d:\test.il 即可產生test.exe,執行看看結果吧

代碼是個大草莓,下一篇我會詳細講講IL組合語言,歡迎關注

 

本文章只供學習,切勿轉載!切記切記(轉載也厚道點寫個出處,謝謝哈)

by Eddy   2010.05.30

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.