国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(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ó)家法律
定西市| 英德市| 黄浦区| 兖州市| 栖霞市| 渭南市| 洮南市| 保山市| 黎平县| 师宗县| 大英县| 永靖县| 上林县| 石渠县| 吐鲁番市| 潼关县| 富阳市| 垣曲县| 中山市| 平阴县| 南城县| 延吉市| 灌云县| 溧阳市| 威远县| 嘉祥县| 多伦县| 桐柏县| 绵阳市| 明光市| 潢川县| 景洪市| 磐安县| 西乡县| 龙井市| 中卫市| 泰安市| 东乌| 宽城| 鹤壁市| 庆元县|