婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 一步步教你讀懂NET中IL(圖文詳解)

一步步教你讀懂NET中IL(圖文詳解)

熱門標簽:外呼系統費用一年 寧波自動外呼系統代理 巫師3為什么地圖標注的財寶沒有 手機地圖標注如何刪除 外呼系統代理品牌 怎么給超市做地圖標注入駐店 世紀佳緣地圖標注怎么去掉 辦理400電話證件 十堰正規電銷機器人系統

接觸NET也有1年左右的時間了,NET的內部實現對我產生了很大的吸引力。個人覺得:能對這些底部的實現進行了解和熟練的話,對以后自己寫代碼是有很大幫助的,好了,廢話不多說,請看下邊:

.NET CLR 和 Java VM 都是堆疊式虛擬機器(Stack-Based VM),也就是說,它們的指令集(Instruction Set)都是採用堆疊運算的方式:執行時的資料都是先放在堆疊中,再進行運算。JavaVM 有約 200 個指令(Instruction),每個指令都是 1 byte 的 opcode(操作碼),后面接不等數目的參數;.NET CLR 有超過 220個指令,但是有些指令使用相同的 opcode,所以 opcode 的數目比指令數略少。特別注意,.NET 的 opcode 長度並不固定,大部分的 opcode 長度是 1 byte,少部分是 2 byte。

下面是一個簡單的 C# 原始碼:                

復制代碼 代碼如下:

using System;
public class Test {
    public static void Main(String[] args) {
        int i=1;
        int j=2;
        int k=3;
        int answer = i+j+k;
        Console.WriteLine("i+j+k="+answer);
    }
}

將此原始碼編譯之后,可以得到一個 EXE的程序。我們可以通過 ILDASM.EXE(圖-0) 來反編譯 EXE 以觀察IL。我將 Main() 的 IL 反編譯條列如下,這裡共有十八道IL 指令,有的指令(例如 ldstr 與 box)后面需要接參數,有的指令(例如 ldc.i4.1 與與add)后面不需要接參數。


圖-0
ldc.i4.1
stloc.0
ldc.i4.2
stloc.1
ldc.i4.3
stloc.2
ldloc.0
ldloc.1
add
ldloc.2
add
stloc.3
ldstr      "i+j+k="
ldloc.3
box        [mscorlib]System.Int32
call       string [mscorlib]System.String::Concat(object, object)
call       void [mscorlib]System.Console::WriteLine(string)
ret

此程式執行時,關鍵的記憶體有三種,分別是:

1、Managed Heap:這是動態配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執行時自動管理,整個Process 共用一個 Managed Heap。

2、Call Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Call Stack。每呼叫一次 method,就會使得Call Stack 上多了一個 Record Frame;呼叫完畢之后,此 Record Frame 會被丟棄。一般來說,Record Frame 內記錄著 method 參數(Parameter)、返回位址(Return Address)、以及區域變數(Local Variable)。Java VM 和 .NET CLR 都是使用 0, 1, 2… 編號的方式來識別區別變數。

3、Evaluation Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每個 Thread 都有自己專屬的 Evaluation Stack。前面所謂的堆疊式虛擬機器,指的就是這個堆疊。

后面有一連串的示意圖,用來解說在執行時此三種記憶體的變化。首先,在進入 Main() 之后,尚未執行任何指令之前,記憶體的狀況如圖1 所示:

圖1                

接著要執行第一道指令 ldc.i4.1。此指令的意思是:在 Evaluation Stack 置入一個 4 byte 的常數,其值為 1。執行完此道指令之后,記憶體的變化如圖2 所示:

ldc.i4.1:表示加載一個值為1到堆棧中,該條指令的語法結構是:
ldc.typevalue:ldc指令加載一個指定類型的常量到stack.
ldc.i4.number:ldc指令更加有效.它傳輸一個整型值-1以及0到8之間的整數給計算堆棧

圖2       

接著要執行第二道指令 stloc.0。此指令的意思是:從 Evaluation Stack 取出一個值,放到第 0 號變數(V0)中。這裡的第 0 號變數其實就是原始碼中的i。執行完此道指令之后,記憶體的變化如圖3 所示:

圖3                

后面的第三道指令和第五道指令雷同於第一道指令,且第四道指令和第六道指令雷同於第二道指令。為了節省篇幅,我不在此一一贅述。提醒大家第 1 號變數(V1)其實就是原始碼中的 j,且第 2 號變數(V2)其實就是源碼中的 k。圖4~7 分別是執行完第三~六道指令之后,記憶體的變化圖:

圖4                

圖5


圖6


圖7

接著要執行第七道指令 ldloc.0 以及第八道指令 ldloc.1:分別將 V0(也就是 i)和 V1(也就是 j)的值放到 Evaluation Stack,這是相加前的準備動作。圖8 與圖9 分別是執行完第七、第八道指令之后,記憶體的變化圖:

圖8


圖9

接著要執行第九道指令 add。此指令的意思是:從 Evaluation Stack 取出兩個值(也就是 i 和 j),相加之后將結果放回 Evaluation Stack 中。執行完此道指令之后,記憶體的變化如圖10 所示:


圖10

接著要執行第十道指令 ldloc.2。此指令的意思是:分別將 V2(也就是 k)的值放到 Evaluation Stack,這是相加前的準備動作。執行完此道指令之后,記憶體的變化如圖11 所示:


圖11

接著要執行第十一道指令 add。從 Evaluation Stack 取出兩個值,相加之后將結果放回 Evaluation Stack 中,此為 i+j+k 的值。執行完此道指令之后,記憶體的變化如圖12 所示:


圖12

接著要執行第十二道指令 stloc.3。從 Evaluation Stack 取出一個值,放到第 3 號變數(V3)中。這裡的第3號變數其實就是原始碼中的 answer。執行完此道指令之后,記憶體的變化如圖13 所示:


圖13

接著要執行第十三道指令 ldstr "i+j+k="。此指令的意思是:將 "i+j+k=" 的 Reference 放進 Evaluation Stack。執行完此道指令之后,記憶體的變化如圖14 所示:


圖14

接著要執行第十四道指令 ldloc.3。將 V3 的值放進 Evaluation Stack。執行完此道指令之后,記憶體的變化如圖15 所示:


圖15

接著要執行第十五道指令 box [mscorlib]System.Int32,從此處可以看出,int到string實際是進行了裝箱操作的,所以會有性能損失,可以在以后的編碼中減少裝箱操作來提高性能。此指令的意思是:從 Evaluation Stack 中取出一個值,將此 Value Type 包裝(box)成為 Reference Type。執行完此道指令之后,記憶體的變化如圖16 所示:


圖16

接著要執行第十六道指令 call string [mscorlib] System.String::Concat(object, object)。此指令的意思是:從 Evaluation Stack 中取出兩個值,此二值皆為 Reference Type,下面的值當作第一個參數,上面的值當作第二個參數,呼叫 mscorlib.dll 所提供的 System.String.Concat() method 來將此二參數進行字串接合(String Concatenation),將接合出來的新字串放在 Managed Heap,將其 Reference 放進 Evaluation Stack。值得注意的是:由於 System.String.Concat() 是 static method,所以此處使用的指令是 call,而非 callvirt(呼叫虛擬)。執行完此道指令之后,記憶體的變化如圖17 所示:


圖17

請注意:此時 Managed Heap 中的 Int32(6) 以及 String("i+j+k=") 已經不再被參考到,所以變成垃圾,等待 GC 的回收。

接著要執行第十七道指令 call void [mscorlib] System.Console::WriteLine(string)。此指令的意思是:從 Evaluation Stack 中取出一個值,此值為 Reference Type,將此值當作參數,呼叫 mscorlib.dll 所提供的 System.Console.WriteLine() method 來將此字串顯示在 Console 視窗上。System.Console.WriteLine() 也是 static method。執行完此道指令之后,記憶體的變化如圖18 所示:

圖18

接著要執行第十八道指令 ret。此指令的意思是:結束此次呼叫(也就是 Main 的呼叫)。此時會檢查 Evaluation Stack 內剩下的資料,由於 Main() 宣告不需要傳出值(void),所以 Evaluation Stack 內必須是空的,本范例符合這樣的情況,所以此時可以順利結束此次呼叫。而 Main 的呼叫一結束,程式也隨之結束。執行完此道指令之后(且在程式結束前),記憶體的變化如圖19 所示:

圖19

通過此范例,讀者應該可以對于 IL 有最基本的認識。對 IL 感興趣的讀者應該自行閱讀 Serge Lidin 所著的《Inside Microsoft .NET IL Assembler》(Microsoft Press 出版)。我認為:熟知 IL 每道指令的作用,是 .NET 程式員必備的知識。.NET 程式員可以不會用 IL Assembly 寫程式,但是至少要看得懂 ILDASM 反編譯出來的 IL 組合碼。

標簽:牡丹江 平涼 山西 嘉興 通遼 景德鎮 天門 泰州

巨人網絡通訊聲明:本文標題《一步步教你讀懂NET中IL(圖文詳解)》,本文關鍵詞  一,步步,教你,讀懂,NET,中,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一步步教你讀懂NET中IL(圖文詳解)》相關的同類信息!
  • 本頁收集關于一步步教你讀懂NET中IL(圖文詳解)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩欧美一区二区久久婷婷| 狠狠色狠狠色综合| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲精品一卡二卡| 精品久久久网站| 久久久综合视频| 一区二区三区精品在线观看| 国产91精品露脸国语对白| 欧美最猛性xxxxx直播| 成人免费视频一区| 日韩欧美一级二级| 精品一区二区综合| 亚洲免费资源在线播放| 久久99国产精品免费网站| 国产欧美日韩久久| 国产成人鲁色资源国产91色综| 亚洲欧洲国产日韩| 天天操天天色综合| 欧美日韩国产首页| 一区二区三区精密机械公司| 亚洲国产va精品久久久不卡综合| 久久青草国产手机看片福利盒子| 国产成人自拍网| 日本亚洲三级在线| 色狠狠综合天天综合综合| 国产精品日韩成人| 欧美综合在线视频| 国产乱码精品一品二品| 日韩天堂在线观看| 日产国产欧美视频一区精品| 悠悠色在线精品| 91啦中文在线观看| 国内精品自线一区二区三区视频| 精品精品国产高清a毛片牛牛| 久久久影视传媒| 香蕉影视欧美成人| 日韩午夜在线观看视频| 裸体歌舞表演一区二区| 337p亚洲精品色噜噜噜| 国产经典欧美精品| 丰满白嫩尤物一区二区| 国产精品久久久久久久久搜平片 | 精品一区二区三区免费毛片爱| 国产一区二区按摩在线观看| 日韩成人午夜精品| 日韩欧美激情一区| 99精品视频在线免费观看| 高潮精品一区videoshd| 国产呦精品一区二区三区网站| 欧美视频一区二| av成人免费在线| 一区二区三区在线视频播放| 久久久91精品国产一区二区精品| 免费成人小视频| 久久66热re国产| 亚洲高清久久久| 一区二区三区在线观看动漫| 久久99久久久欧美国产| 亚洲韩国一区二区三区| 99久免费精品视频在线观看| 一区二区三区四区乱视频| 91色视频在线| 久久亚洲一级片| 欧美理论电影在线| 国产亚洲一二三区| 99国产精品久久久久久久久久| 欧美高清视频一二三区| 成人三级在线视频| 国产在线麻豆精品观看| 久久成人免费网站| 另类调教123区 | 欧亚一区二区三区| 成人激情开心网| 欧美一二三区在线| 一区二区三区四区高清精品免费观看 | 国产伦精品一区二区三区免费迷 | 视频一区国产视频| 丝袜美腿成人在线| 久久精品99国产国产精| 亚洲一区二区三区四区在线免费观看| 日韩高清一级片| 国产精品女上位| 欧美大片拔萝卜| 亚洲午夜私人影院| 国产亚洲成aⅴ人片在线观看| 91久久香蕉国产日韩欧美9色| 午夜精品福利在线| 中文字幕在线视频一区| 亚洲人成在线观看一区二区| 欧美国产视频在线| 狠狠色综合色综合网络| 日韩精品一区二区在线| 一区视频在线播放| 亚洲一区免费观看| 亚洲激情图片一区| 色哟哟国产精品| 久久久久久黄色| 欧美日韩一区二区在线观看| 日本一区二区免费在线| 亚洲小少妇裸体bbw| 日韩av一区二区在线影视| 日韩免费高清av| 久久精品国产**网站演员| 2021中文字幕一区亚洲| 国产精品欧美一级免费| 久久精品二区亚洲w码| 久久理论电影网| 国产色综合一区| 亚洲福利视频一区| 日本成人中文字幕| 国产成人在线免费观看| 国产精品美女久久久久高潮| 亚洲制服丝袜av| 欧美群妇大交群中文字幕| 欧美日韩精品一区二区三区| 国产一区日韩二区欧美三区| 丰满白嫩尤物一区二区| 欧美体内she精高潮| 欧美α欧美αv大片| 日韩精品一二三| 国产精品一区不卡| 国产三级精品三级在线专区| 五月激情丁香一区二区三区| 在线日韩av片| 亚洲午夜在线电影| 欧美日韩三级在线| 99精品欧美一区二区蜜桃免费| 91精品国产丝袜白色高跟鞋| 一区二区三区中文字幕在线观看| 国精产品一区一区三区mba视频| 成人av第一页| 亚洲一区二区三区免费视频| www.亚洲精品| 亚洲一区二区视频在线| 一区二区三区中文字幕电影| 欧美喷潮久久久xxxxx| 欧美精品v日韩精品v韩国精品v| 中文字幕一区二区三中文字幕| 国产精品资源网| 色域天天综合网| ww久久中文字幕| 亚洲第一福利视频在线| 国内久久婷婷综合| 久久九九影视网| 国产精品国产自产拍在线| 美女一区二区三区| 欧美区视频在线观看| 亚洲欧美综合色| 奇米色一区二区三区四区| 精品视频一区二区三区免费| 一区二区在线电影| 色综合久久中文综合久久牛| 久久女同互慰一区二区三区| 亚洲一二三级电影| 99久免费精品视频在线观看| 一区二区三区欧美日| 成人做爰69片免费看网站| 欧美精品 日韩| 91麻豆文化传媒在线观看| 国产一区二区三区香蕉| 亚洲日本欧美天堂| 欧美一区二区三区四区五区 | 粉嫩一区二区三区性色av| 欧美三级资源在线| 午夜欧美一区二区三区在线播放 | 色www精品视频在线观看| av在线不卡免费看| 欧美xxx久久| 粉嫩一区二区三区性色av| 国产乱妇无码大片在线观看| 亚洲国产精品成人综合| 国产91高潮流白浆在线麻豆| 爽爽淫人综合网网站| 欧美久久久久久久久中文字幕| 午夜影视日本亚洲欧洲精品| 精品欧美久久久| 蜜臀精品久久久久久蜜臀| 欧美性猛交xxxxxxxx| 9i在线看片成人免费| 中文字幕欧美一区| 欧美一区二区成人6969| 国产精品自在欧美一区| 久久成人久久鬼色| 亚洲精品v日韩精品| 亚洲天堂久久久久久久| 奇米精品一区二区三区在线观看 | 色狠狠综合天天综合综合| 色综合久久久久久久久久久| 韩国欧美国产一区| 亚洲v日本v欧美v久久精品| 久久亚洲二区三区| 日本怡春院一区二区| 亚洲最新视频在线观看| 欧美视频在线观看一区二区| 在线观看免费成人| 亚洲欧美怡红院| 精品福利一区二区三区| 3751色影院一区二区三区| 日韩欧美在线影院| 欧美一区二区三区思思人|