基础概念

Microsoft中间语言(MSIL),也成为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成。MSIL是独立于平台的,因此,他可以在任何公共语言基础架构支持特定的环境上执行。

通过JIT编译器将MSIL转换为特定计算机环境的特定机器代码。这是在执行MSIL之前完成的,同样,MSIL在需求的基础上转换为机器代码,既JIT编译器根据需要而不是整个MSIL进行编译。

公共语言运行时(CLR)中的执行过程:执行过程包括创建MSIL以及通过JIT编译器将MSIL转换为机器代码,如下所示:

  • 在CLR的编译期间,特定于语言的编译器会将源代码转换为MSIL。此外,与MSIL一起,在编译中还会生成元数据。元数据包含诸如代码中类型的定义和签名,运行时信息等信息。
  • 通过组装MSIL,可以创建一个公共语言基础结构(CLI)组装。该程序集基本上是用于安全性,部署,版本控制等已编译的代码库,它具有两种类型,进程程序集(EXE)和程序集(DLL)。
  • 然后JIT编译器将Microsoft中间语言(MSIL)转换为特定于JIT编译器运行所在的计算机环境的机器代码。MSIL在需求的基础上转换器为机器代码,即JIT编译器根据需要而不是整个MSIL进行编译。
  • 然后,由JIT编译器获得的机器代码由计算机的处理器执行。

打印字符串

static void Main(string[] args)
{Console.WriteLine("HelloWord!");
}

.entrypoint 定义程序的入口点,该函数在程序启动时由.NET运行库调用

.maxstack 定义函数代码所用堆栈的最大深度

.ldstr string把一个字符串常量装入堆栈

call function(parameters)调用静态函数,函数的参数必须在函数调用前装入堆栈

pop 取出栈顶的值,当我们不需要把值存入变量时使用

ret 从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。

  .method private hidebysig static voidMain(string[] args) cil managed{.entrypoint //主函数,程序的入口.maxstack 8 //栈的最大深度。// [8 9 - 8 10] IL_0000: nop //什么都不做// [9 13 - 9 45]IL_0001: ldstr        "HelloWord!" //把字符串压入堆栈IL_0006: call         void [System.Console]System.Console::WriteLine(string) //调用WriteLineIL_000b: nop //什么都不做// [10 9 - 10 10]IL_000c: ret //return} // end of method Program::Main

数据运算

add 2个值相加。命令的参数必须在调用前装入堆栈,该函数从堆栈中移除参数并把运算后的结果压入堆栈。

sub 2个值相减

mul 2个值相乘

static void Main(string[] args)
{int x = 1;Console.WriteLine(x * 3 + 1 - 1);
}
  .method private hidebysig static voidMain(string[] args) cil managed{.entrypoint  //主函数,程序的入口.maxstack 2  //栈的最大深度.locals init ([0] int32 x,[1] int32 y,[2] int32 z //本地变量定义,定义int类型的 x、y、z)// [8 9 - 8 10]IL_0000: nop //什么都不做// [9 13 - 9 23]IL_0001: ldc.i4.1  //把x的值放到计算堆栈上IL_0002: stloc.0  //把计算堆栈顶部的值(x)放到调用堆栈索引0处// [10 13 - 10 23]IL_0003: ldc.i4.3 //把z的值放到计算堆栈上IL_0004: stloc.1      //把计算堆栈顶部的值(y)放到调用堆栈索引1处// [11 13 - 11 23]IL_0005: ldc.i4.1 //把x的值放到计算堆栈上IL_0006: stloc.2      //把计算堆栈顶部的值(z)放到调用堆栈索引2处// [12 13 - 12 46]IL_0007: ldloc.0       //把调用堆栈索引为0处的值复制到计算堆栈IL_0008: ldloc.1      //把调用堆栈索引为1处的值复制到计算堆栈IL_0009: mul //相乘IL_000a: ldloc.2  //把调用堆栈索引为2处的值复制到计算堆栈IL_000b: add //相加IL_000c: ldloc.2      //把调用堆栈索引为2处的值复制到计算堆栈IL_000d: sub //相减IL_000e: call         void [System.Console]System.Console::WriteLine(int32) //调用WriteLineIL_0013: nop //什么都不做// [13 9 - 13 10]IL_0014: ret //return} // end of method Program::Main

Reference

https://www.geeksforgeeks.org/cil-or-msil-microsoft-intermediate-language-or-common-intermediate-language/

MSIL入门(一)C#代码与IL代码对比相关推荐

  1. 四、CLR执行程序集中代码和IL代码简介

    三.加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目标平台的过程. 本问主要介绍公共语言加载 ...

  2. 基于mono.ceil对c#进行注入垃圾代码,混淆代码,IL代码注入

    前言 unity的c#层,编译处理的程序集Assembly_CSharp.dll,通过dnspy反编译出来,可以看到自己写的代码,代码也是公司的财产(大雾,这不是我说的),但是开发项目过程中,有什么方 ...

  3. [你必须知道的.NET]第十四回:认识IL代码---从开始到现在

    本文将介绍以下内容: ·       IL代码分析方法 ·       IL命令解析 ·       .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持, ...

  4. 详解.NET IL代码(一)

    本文主要介绍IL代码,内容大部分来自网上,进行整理合并的. 一.IL简介 为什么要了解IL代码? 如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以 ...

  5. .Net IL代码研究

    参考文章:http://www.cnblogs.com/zery/p/3366175.html 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的 ...

  6. java 方法引用无效_InvalidProgramException:调用方法时无效的IL代码

    我收到此运行时错误: InvalidProgramException: Invalid IL code . 我正在使用unity 5.3.1f1 . 该项目是编辑器扩展 . 代码的简化版本是: pub ...

  7. CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

    CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...

  8. C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...

    本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...

  9. TensorFlow发布语音识别入门教程,附1GB数据集代码

    原标题:TensorFlow发布语音识别入门教程,附1GB数据集&代码 机械鸡的鸡友经常问:如何开始入门深度学习语音和其他音频识别,例如关键字检测或语音命令. 虽然有一些伟大的开源语音识别系统 ...

最新文章

  1. HDU_2112 HDU Today(DIjkstra + map映射)
  2. C#进行Visio二次开发之知识点考核试题
  3. 获取ip地理位置的 api接口 简介
  4. 羡慕女设计师啊,天生色感好!
  5. CentOS 初体验十六:阿里云安装Nexus搭建Maven私有仓库
  6. minigui linux 安装与运行
  7. 15分钟内使用Twilio和Stormpath在Spring Boot中进行身份管理
  8. python抢货程序_写个Python程序上下班抢个顺风单
  9. java .net 3des_Java.net3DES差异及互通
  10. 数据库_数据库系统概论
  11. C#中,将16进制转换为有符号的10进制的方法(支持带0x标志,支持任意字符串)
  12. 使用阿里云容器监控服务与第三方监控框架集成搭建自己的容器看板
  13. 常用DateUtil
  14. c语言温度转换作业帮,C++摄氏度和华氏度互相转化
  15. SMTP和POP协议
  16. java 线程 设计模式_Java多线程设计模式(四)
  17. [React Native]导航器Navigator
  18. edgy trees_将Ubuntu从Edgy升级到Feisty(6.10至7.04)
  19. Android常考问题(8)-设计模式:Builder模式(顺带学习了一下String的比较和final)
  20. hdu 5175 Misaki's Kiss again (抑或运算+公式变形)

热门文章

  1. 大数据7大最奇特的应用
  2. 2021高考赤峰成绩查询,2021年赤峰高考成绩排名及成绩公布时间什么时候出来
  3. python中BSON模块使用详解
  4. 2021新款 iPad,包邮送一个!
  5. windows安装cryptography或者pycrypto异常解决办法
  6. CentOS下利用Docker部署Surging
  7. Nessus8.4.0漏洞扫描工具安装及使用
  8. 【Linux】如何在保存后退出VIM编辑器
  9. http三次握手和四次挥手
  10. AutoCAD单独卸载,不影响其他软件,CAD 2021安装失败,怎么完全彻底卸载删除清理干净CAD 2021各种残留注册表和文件?