最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MSIL的機(jī)器碼簡(jiǎn)析

2023-06-09 20:15 作者:Cpp程序員  | 我要投稿

前言

一般的只有最終的匯編代碼才有機(jī)器碼表示,然一個(gè)偶然的機(jī)會(huì)發(fā)現(xiàn),MSIL(Microsoft intermediate language)作為一個(gè)中間語(yǔ)言表示,居然也有機(jī)器碼,其實(shí)這也難怪,計(jì)算機(jī)里面萬(wàn)物都是二進(jìn)制,本篇來(lái)看下,以下以.Net8 PreView Source Code分析為主。原文:在此處


概括

1.C# And IL
先上C#代碼:

static void Main() { ? ? Program pm=new Program(); ? ? GC.Collect(); ? ? Console.WriteLine("CeShi JITDUMP"); ? ? Console.ReadLine(); }

非常簡(jiǎn)單的一段代碼,把這段代碼編譯后的DLL導(dǎo)入到微軟官方的ILDASM工具里面去,可以看到如下代碼:

.method private hidebysig static void ?Main() cil managed { ? .entrypoint ? // 代碼大小 ? ? ? 28 (0x1c) ? .maxstack ?8 ? IL_0000: ?newobj ? ? instance void Program::.ctor() ? IL_0005: ?pop ? IL_0006: ?call ? ? ? void [System.Runtime]System.GC::Collect() ? IL_000b: ?ldstr ? ? ?"CeShi JITDUMP" ? IL_0010: ?call ? ? ? void [System.Console]System.Console::WriteLine(string) ? IL_0015: ?call ? ? ? string [System.Console]System.Console::ReadLine() ? IL_001a: ?pop ? IL_001b: ?ret } // end of method Program::Main

這里注意下標(biāo)號(hào)IL_0000的那段代碼:

IL_0000: ?newobj ? ? instance void Program::.ctor()

以此為例子作為觀察。

2.JIT Import IL
來(lái)看下JIT把這段IL代碼導(dǎo)入后的一個(gè)情況

IL to import: IL_0000 ?73 04 00 00 06 ? ?newobj ? ? ? 0x6000004 IL_0005 ?26 ? ? ? ? ? ? ? ?pop IL_0006 ?28 0e 00 00 0a ? ?call ? ? ? ? 0xA00000E IL_000b ?72 01 00 00 70 ? ?ldstr ? ? ? ?0x70000001 IL_0010 ?28 0f 00 00 0a ? ?call ? ? ? ? 0xA00000F IL_0015 ?28 10 00 00 0a ? ?call ? ? ? ? 0xA000010 IL_001a ?26 ? ? ? ? ? ? ? ?pop IL_001b ?2a ? ? ? ? ? ? ? ?ret

注意到JIT導(dǎo)入這段IL代碼之后,多了機(jī)器碼,多了十六進(jìn)制的表示。以IL_0000段代碼為例

導(dǎo)入之前:

IL_0000: ?newobj ? ? instance void Program::.ctor()

這里newobj之前沒(méi)有機(jī)器碼,newobj之后是調(diào)用了函數(shù)instance void Program::.ctor()。

導(dǎo)入之后:

IL_0000 ?73 04 00 00 06 ? ?newobj ? ? ? 0x6000004

這里很明顯看到變化,newobj之前有一連串的機(jī)器碼:73 04 00 00 06。newobj之后,則有十六進(jìn)制0x6000004取代了上面的函數(shù)調(diào)用:instance void Program::.ctor()。

3.分析
那么IL里面的這些機(jī)器碼和十六進(jìn)制數(shù)值是干什么用的呢?
首先看下機(jī)器碼:73 04 00 00 06。一個(gè)個(gè)的看。
最先的0x73,它表示的是:newobj的機(jī)器碼。它的原型是:

OPDEF(CEE_NEWOBJ, "newobj",VarPop,PushRef,InlineMethod, ? IObjModel, 1,0xFF,0x73,CALL)

后面的04 00 00 06這四個(gè)字節(jié)的機(jī)器碼可以看做一個(gè)整體,小端取值那么它的值是:6000004。

那么這個(gè)6000004到底表示什么東西呢?通過(guò)ILDASM的快捷鍵Ctrl+M打開(kāi)元數(shù)據(jù)信息,里面可以看到6000004表示的就是.ctor函數(shù)的元數(shù)據(jù)描述,它的原型如下:

Method #2 (06000004) ------------------------------------------------------- MethodName: .ctor (06000004) Flags ? ? : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] ?(00001886) RVA ? ? ? : 0x00002084 ImplFlags : [IL] [Managed] ?(00000000) CallCnvntn: [DEFAULT] hasThis ?ReturnType: Void No arguments.

那么這段代碼

IL_0000 ?73 04 00 00 06 ? ?newobj ? ? ? 0x6000004

的整體意思就很清楚了,73 04 00 00 06里面的73是表示newobj,后面的04 00 00 06表示調(diào)用.ctor非靜態(tài)構(gòu)造函數(shù)。它實(shí)際上跟ILDASM里面顯示的IL代碼是同一個(gè)意思,但是因?yàn)樵趦?nèi)存里面操作,所以它只能是十六進(jìn)制或者二進(jìn)制,JIT導(dǎo)入的時(shí)候只不過(guò)把字母的含義替換成了具體數(shù)字的含義。其它的IL代碼依次類(lèi)推。


MSIL的機(jī)器碼簡(jiǎn)析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
香港| 嘉义市| 扶绥县| 苏尼特右旗| 维西| 刚察县| 同心县| 陕西省| 南靖县| 大城县| 同德县| 慈利县| 万年县| 东辽县| 五峰| 资中县| 治县。| 桐乡市| 克拉玛依市| 称多县| 陆河县| 德化县| 邻水| 海宁市| 浪卡子县| 郑州市| 昌平区| 巴彦淖尔市| 怀宁县| 北川| 惠东县| 奉贤区| 灵武市| 龙门县| 陇川县| 米泉市| 射阳县| 隆回县| 定边县| 兴隆县| 永泰县|