.Net8罕见的技术:MSIL的机器码简析
前言
一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机里面万物都是二进制,本篇来看下,以下以.Net8 PreView Source Code分析为主。原文:在此处
概括
1.C# And IL
先上C#代码:
static void Main()
{
Program pm=new Program();
GC.Collect();
Console.WriteLine("CeShi JITDUMP");
Console.ReadLine();
}
非常简单的一段代码,把这段代码编译后的DLL导入到微软官方的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
这里注意下标号IL_0000的那段代码:
IL_0000: newobj instance void Program::.ctor()
以此为例子作为观察。
2.JIT Import IL
来看下JIT把这段IL代码导入后的一个情况
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导入这段IL代码之后,多了机器码,多了十六进制的表示。以IL_0000段代码为例
导入之前:
IL_0000: newobj instance void Program::.ctor()
这里newobj之前没有机器码,newobj之后是调用了函数instance void Program::.ctor()。
导入之后:
IL_0000 73 04 00 00 06 newobj 0x6000004
这里很明显看到变化,newobj之前有一连串的机器码:73 04 00 00 06。newobj之后,则有十六进制0x6000004取代了上面的函数调用:instance void Program::.ctor()。
3.分析
那么IL里面的这些机器码和十六进制数值是干什么用的呢?
首先看下机器码:73 04 00 00 06。一个个的看。
首先的0x73,它表示的是:newobj的机器码。它的原型是:
OPDEF(CEE_NEWOBJ, "newobj",VarPop,PushRef,InlineMethod, IObjModel, 1,0xFF,0x73,CALL)
后面的04 00 00 06这四个字节的机器码可以看做一个整体,小端取值那么它的值是:6000004。
那么这个6000004到底表示什么东西呢?通过ILDASM的快捷键Ctrl+M打开元数据信息,里面可以看到6000004表示的就是.ctor函数的元数据描述,它的原型如下:
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表示调用.ctor非静态构造函数。它实际上跟ILDASM里面显示的IL代码是同一个意思,但是因为在内存里面操作,所以它只能是十六进制或者二进制,JIT导入的时候只不过把字母的含义替换成了具体数字的含义。其它的IL代码依次类推。
结尾
作者:江湖评谈
文章首发在公众号(jianghupt)上,欢迎关注

.Net8罕见的技术:MSIL的机器码简析的更多相关文章
- [转帖]简析数据中心三大Overlay技术
简析数据中心三大Overlay技术 http://www.jifang360.com/news/20161010/n225987768.html 搭建大规模的云计算环境需要数据中心突破多种技术难题,其 ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- DiskGenius注册算法简析
初次接触DiskGenius已经成为遥远的记忆,那个时候还只有DOS版本.后来到Windows版,用它来处理过几个找回丢失分区的案例,方便实用.到现在它的功能越来越强大,成为喜好启动技术和桌面支持人员 ...
- 简析.NET Core 以及与 .NET Framework的关系
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
- Linux 目录结构学习与简析 Part2
linux目录结构学习与简析 by:授客 QQ:1033553122 ---------------接Part 1-------------- #1.查看CPU信息 #cat /proc/cpuinf ...
- XMR恶意挖矿案例简析
前言 数字货币因其技术去中性化和经济价值等属性,逐渐成为大众关注的焦点,同时通过恶意挖矿获取数字货币是黑灰色产业获取收益的重要途径.本文简析通过蜜罐获取的XMR恶意挖矿事件:攻击者通过爆破SSH获取系 ...
- 简析 Tomcat 、Nginx 与 Apache 的区别
简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...
- JDK框架简析--java.lang包中的基础类库、基础数据类型
题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含 ...
- Linux网络性能优化方法简析
Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux ...
- 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...
随机推荐
- C/C++ 恨透了 double free or corruption
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都 ...
- 鼎捷ERP二维码整体解决方案 Tiptop GP条码管理系统 鼎捷ERP移动解决方案 鼎捷条码扫描 鼎捷WMS仓库移动扫码 鼎捷安卓PDA扫码方案 Tiptop 出入库盘点出货条码扫码 提供源码
本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 最近定制开发了一套适合企业的条码扫码平台,基于鼎 ...
- pysimplegui之第一个程序,包括回调函数,事件,阻塞等待内容
自定义窗口 API 调用(您的第一个窗口) 总结一下:我遇到的坑, 比如拿输入框的内容的时候可以直接通过value[key] 几种窗口模式就是什么时候用timeout这个参数 关闭窗口可以的一边形式 ...
- [Linux]常用命令之【du/fdisk/df/ls】#磁盘管理/文件管理#
本文的经典应用场景: 1.查找占用磁盘存储空间最大的目录/文件 2.关于[磁盘分区]的相关概念和实操,详见另一博文:[Linux]磁盘分区 - 博客园/千千寰宇 1 fdisk fdisk := &q ...
- AVL树的构建
package com.xd.leetcode.shu; /** * created by lianzhen on 2020-03-10 10:27. describe:平衡二叉树的构建 * * LL ...
- 人群定向SQL表
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for rc_throng -- ------ ...
- 【Vue项目 + 自写java后端】尚品汇(七)后台项目 ElementUI 表单验证 + 三级联动
ElementUI 表单验证 1 标准验证规则 Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可 ...
- 如何解决Gridea部分主题不渲染Katex的问题
很多好看的主题因为对象不是信息学,所以忽视了公式,即 \(\LaTeX\) . 导致,如果你想渲染一个 \(n\) ,结果成了 nn 这个简单,导入文件即可. 找到主题文件夹,打开 templates ...
- [Pytorch框架] 2.1.4 数据的加载和预处理
文章目录 PyTorch 基础 :数据的加载和预处理 Dataset Dataloader torchvision 包 torchvision.datasets torchvision.models ...
- ADB-安装配置
一.只要下载ADB安装包即可 就这4个文件: 备注:如果下载放入到D盘去解压,打开dos窗口那么就要进入到D盘,然后再去执行adb命令,输入adb查看它是否安装成功 二.ADB命令简单使用 查看连接设 ...