五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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ó)家法律
沙坪坝区| 法库县| 拜城县| 崇阳县| 长寿区| 阿克陶县| 渭源县| 益阳市| 泾源县| 西吉县| 嘉定区| 浙江省| 讷河市| 合江县| 平昌县| 福鼎市| 米脂县| 耿马| 东城区| 临城县| 谢通门县| 大洼县| 伽师县| 浑源县| 凤翔县| 静海县| 乡城县| 化德县| 辽源市| 银川市| 光泽县| 西充县| 榆林市| 墨玉县| 香格里拉县| 蒙阴县| 监利县| 合山市| 广灵县| 定安县| 资中县|