.Net8罕见的技术:MSIL的机器码简析

news2024/11/25 6:35:20

前言

一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,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)上,欢迎关注image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GitHub探索】用python写web前端之reactpy探索

你有想象过用python来写web前端这种操作么?近期在github-trending上就有这样的一个项目reactpy,可以满足你在python上写web前端的欲望。为此,笔者也决定踩踩坑,看看这个项目的形式到底如何,能不能很方便地实际投产。 …

对比 document.URL 和 location.href

对比 document.URL 和 location.href document.URL 和 location.href 的不同点 document.URL只读 , location.href读写 给 document.URL 赋值, document.URL的值不会改变 给 location.href 赋值, location.href 的值改变了, 并且页面也改变了, 效果和 location.assign()一样…

解数独--难的一批

1题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数…

【MySQL】数据库SQL语句之DML

目录 前言: 一.DML添加数据 1.1给指定字段添加数据 1.2给全部字段添加数据 1.3批量添加数据 二.DML修改数据 三.DML删除数据 四.结尾 前言: 时隔一周,啊苏今天来更新啦,简单说说这周在做些什么吧,上课、看书、…

ubuntu编译安装pcl

环境配置: ubuntu18.04pcl1.11.0 下载源码并解压 tar -zxvf pcl-pcl-1.11.0.tar.gz 进入解压后的文件夹、建立bulid文件夹并进入该文件夹 安装依赖 sudo apt-get update 使用apt-get包管理器安装CMake: sudo apt-get install cmake 使用apt-get包管理…

创新案例 | 新锐品牌Usmile如何借助社媒运营打造爆品成为国产电动牙刷TOP1?

Usmile 是广州星际悦动股份有限公司旗下全面口腔护理品牌。2016 年至今,Usmile共荣获了 16 项国内外设计大奖,2020 年“双十一”期间,入选 2020 年度天猫十大新品牌,销售额超 1 亿,成为国内首个破亿的电动牙刷品牌&…

【立体视觉(一)】之成像原理与相机畸变

【立体视觉(一)】之成像原理与相机畸变 一、成像原理一)针孔模型二)坐标系转换1. 世界坐标系到相机坐标系2. 相机坐标系到图像坐标系3. 图像坐标系到像素坐标系4. 相机坐标系到像素坐标系5. 世界坐标系到像素坐标系 二、相机畸变一…

618数码节该如何挑选,推荐几款618值得入手的数码好物

又到了一年一度的618剁手季,各大电商平台都纷纷推出了超级大促活动,激发了无数值友的狂热购物欲望。你是否也已经开始摩拳擦掌,准备掏钱包买买买呢?那么赶快听听小编的建议吧!经过自己使用的亲身体验,小编给…

Superset | 地图无法显示的问题

知识目录 一、写在前面二、Superset地图显示不了三、Superset无法加载已更新的MySQL数据库数据 一、写在前面 大家好!我是初心,一直在寻找并尝试着适合自己的方向! Apache Superset是一款由Python语言为主开发的开源时髦数据探索分析以及可…

高通 Camera HAL3:集成camxoverridesettings.txt到整机版本

camxoverridesettings.txt 是高通提供给开发者临时进行CAMX、CHI-CDK功能调试的一种方式,通过配置各种变量值然后写入到该文件,能控制Log打印、参数配置、数据dump等多种功能 这个文件需要集成在设备目录的vendor/etc/camera/里 因为camxoverridesetti…

2023年金九银十最新 Java面试必背八股文(含答案)详解

马上又逢金九银十,意味着很多人又面临着就职和跳槽,相信还有很多人对于自己就职没有很大的把我,今天就给大家分享我一个朋友总结的Java必问核心知识点,以及面试真题解答。 Java 面试 现在 Java 面试都是靠八股文,所以…

SOFA Weekly|可信基础设施技术分论坛、Layotto 社区会议回顾与预告、社区本周贡献...

SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…

【可乐荐书】Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作

本栏目将推荐一些经典的、有趣的、有启发性的书籍,这些书籍涵盖了各个领域,包括文学、历史、哲学、科学、技术等等。相信这些书籍不仅可以让你获得知识,还可以让你感受到阅读的乐趣和魅力。 今天给大家推荐的书籍是:《Python自动…

互联网最全Java面试八股文,整整1658页,带你轻松应对各种面试题

又是一年一度的秋招大热门,为助力广大程序员朋友 “面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》! 注:这份神技是由内部十余名Java架构讲师纯手打总结的最新版面试突击文档&a…

分集与路径合并方式

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 分集分集的概念分集…

《C和指针》读书笔记(第十章 结构和联合)

目录 0 简介1 结构基础知识1.1 结构声明1.2 结构成员1.3 结构成员的直接访问1.4 结构成员的间接访问1.5 结构的自引用1.6 不完整的声明1.7 结构的初始化 2 结构、指针和成员2.1 访问指针2.2 访问结构2.3 访问结构成员2.4 访问嵌套的结构2.5 访问指针成员 3 结构的存储分配4 作为…

TiDB亿级数据亚秒响应查询集群部署

目录 1 集群部署1.1 环境要求1.1.1 操作系统建议配置1.1.2 服务器建议配置 1.2 环境准备1.3 安装TiUP1.3.1 什么是TiUP1.3.2 安装TiUP组件1.3.3 配置TiUP环境1.3.4 检查TiUP 工具是否安装1.3.5 安装 cluster 组件1.3.6 升级cluster组件 1.4 编辑部署文件1.4.1 常见的部署场景1.…

Go语言并发微服务分布式高可用

Go语言并发微服务分布式高可用 Go语言基础 环境安装 命令行输入go,当前操作系统Os环境中依赖于PATH指定的日录们去找命令(可执行文件)windows会优先搜索当前日录,当前日录没有才依赖PATH中指定的日录 环境变量: 操作系统运行环境中提前定义好的变量P…

FreeRTOS简单任务创建和任务删除(基于stm32F407)

1. 实验目的 使用动态方法 xTaskCreate()创建任务,使用vTaskDelete()函数删除任务;创建开始任务start_task,在开始任务中创建其他三个任务,创建task1任务实现LED0每500ms闪烁一次,创建task2任务实现LED1每500ms闪烁一…

Linux C简易聊天室

对于初学者而已,我们学习的网络编程(如TCP,UDP编程),我们通常都是在局域网内进行通信测试,有时候我们或者会想,我们现在写的内网网络数据和外网的网络数据有什么不同,我们内网的数据是如何走出外…