【IL】IL入门
1.IL基本介绍
1.1 CLR介绍
在介绍IL之前,先说一说CLR。CLR的全称Commen Language Runtime 公共语言运行时。因为CLR的存在,使得多语言开发成为可能。下面给出一张图片,解释支持CLR的几种语言的关系。

从上面的图片可以看出,CLR其实是不关心开发人员用哪一种语言写源代码。这意味着在选择编程语言时,应该选择最容易表达自己意图的语言。可用任何一种语言开发代码,只要编译器是面向CLR的就可以了。
Microsoft创建了好几种面向CLR的语言编辑器,包括:C/C++、C#、Visual Basic、F#、Iron Python、Iron Ruby、IL编辑器,当然面向CLR的语言绝不止Miscrosoft提供的这几种。
在上面的图片,有一点值得提出,IL编译器也是面向CLR的。虽然最终CLR会把托管模块中的IL代码编译成本机CPU指令,但是IL编译器本身也是面向CLR的,所以可以直接利用IL进行开发。查看 如何对C#程序进行反编译,获得更详细的内容。
1.2 IL介绍
在上面介绍CLR概念的时候,知道了IL也是面向CLR的,IL的全称是中间代码(intermediate code),也称为托管代码(managed code)。所有面向CLR的编译器,最终都会把相应的代码编译为托管模块。注意,高级语言通常只公开了CLR全部功能的一个子集,然而,IL汇编语言是允许开发人员访问CLR的全部功能的,例如:C++编译的托管模块,希望能够在C#程序中调用,但是C++和C#可能由于支持的功能不一样,在C#中有可能不会成功调用,反之,C#的程序可能在C++中也不会 成功调用,无论怎样IL是支持的,也就是说IL是能够全部访问所有CLR功能的。如果在开发中,遇到一种语言不能解决的问题,可以考虑使用另一种语言,或是使用IL语言。
2.IL案例讲解
在这里笔者使用C#作为源代码:
static void Main(string[] args)
{
int num = ;
int num2 = ;
int num3 = ;
Console.WriteLine(num+num2+num3);
}
IL代码为:
//hidebysig指令表示如果当前类为父类,用该指令标记的方法将不会被子类继承
//cil managed表明方法体中的代码是IL代码,且是托管代码,即运行在CLR运行库上的代码
.method private hidebysig static void Main(string[] args)cil managed
{
.entrypoint //该指令代表该函数程序的入口函数。每一个托管应用程序都有且只有一个入口函数,CLR加载程序时,首先从.entrypoint函数开始执行。
.maxstack //执行构造函数时,评估堆栈可容纳数据项的最大个数。评估堆栈是保存方法中所需要变量的值的一个内存区域,该区域在方法执行结束时会被清空,或者存储一个返回值。
.locals init (
[] int32 num,
[] int32 num2,
[] int32 num3) //表示定义int类型的变量,变量名分别为num,num2,num3。存储在调用栈。
L_0000: nop //No operation的意思,即没有任何操作。
L_0001: ldc.i4. //将“1”压入评估栈,此时“1”处于评估栈的栈顶。
L_0002: stloc. //此指令表示把值从评估栈中弹出,并赋值给调用栈的第0个变量num。
L_0003: ldc.i4.
L_0004: stloc.
L_0005: ldc.i4.
L_0006: stloc. //从.locals init到L_0006,相当于C#代码的为i,j,k赋值。
L_0007: ldloc. //取调用栈中位置为0的元素压入评估栈(取i的值)。
L_0008: ldloc. //取调用栈中位置为1的元素压入评估栈(取j的值)。
L_0009: add //做加法操作
L_000a: ldloc. //取调用栈中位置为2的元素压入评估栈(取k的值)。
L_000b: add //做加法操作
L_000c: call void [mscorlib]System.Console::WriteLine(int32) //调用输出方法
L_0011: nop //No Operation
L_0012: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() //调用ReadKey方法
L_0017: pop //把评估栈的内容清空
L_0018: ret //return 标记返回值
} //Main方法结束
观察上面的IL代码,可以发现,汇编语言和高级语言的不一样之处,在汇编语言中,声明一个变量,首先要把变量名存储, 然后把值压入到栈堆中,最后把值弹出并且赋值给相应的变量。关于Il的指令详细,可以查看 IL指令详解。
【IL】IL入门的更多相关文章
- IL接口和类的属性
上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...
- 读懂IL代码(一)
以前刚开始学C#的时候,总有高手跟我说,去了解一下IL代码吧,看懂了你能更加清楚的知道你写出来的代码是如何运行互相调用的,可是那时候没去看,后来补的,其实感觉也不晚.刚开始看IL代码的时候,感觉非常吃 ...
- 谈谈托管代码、IL、CLR、ISAPI?
什么是托管代码? 托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...
- C#基础拾遗系列之一:先看懂IL代码
一.前言 首先,想说说为什么要写这样系列的文章,有时候在和同事朋友聊天的时候,经常会听到这样的话题: (1)在这家公司没什么长进,代码太烂,学不到东西.(你有没有想想框架为什么这样写,代码还可以怎么去 ...
- C# to IL 3 Selection and Repetition(选择和重复)
In IL, a label is a name followed by the colon sign i.e ":". It gives us the ability to ju ...
- IL and 堆于栈
CIL的基本构成+CIL操作码速记表+CIL操作码大全速查 引用类型:引用类型存储在堆中.类型实例化的时候,会在堆中开辟一部分空间存储类的实例.类对象的引用还是存储在栈中. 值类型:值类型总是分配在它 ...
- 【转载】读懂IL代码就这么简单 (一)
一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...
- vs 查看IL
vs--工具--外部工具--新增1 标题:随便填, 2 命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Too ...
- 数位dp 的简单入门
时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...
- Python之路,第五篇:Python入门与基础5
python 循环语句 作用: 根据一定的条件,重复的执行一个或多个语句 两种循环语句: while 语句 for 语句 while 语句: 语法: while 真值表达式: 语句1 ... ...
随机推荐
- 7.4 Javascript:表单验证-揭开正則表達式的面纱
用元字符匹配对应的字符类型 创建正則表達式有点像创建字符串字面量,仅仅只是正則表達式出如今一对"/"里 正則表達式中会用到一级元字符.用于连接字母与数字 "." ...
- thrift系列 - 快速入门
1.简介 Thrift是当前流行的RPC框架之一,它有强大的代码生成引擎,可以跨语言,轻松解决程序间的通信问题. 本文旨在帮助大家快速入门,若想深入原理,请参见thrift官网:h ...
- [Spring Boot] Singleton and Prototype
When we use Bean to do autowired, it actually use singleton, so even we create multi instanses, they ...
- Mybatis之使用注解开发CRUD
上一篇演示了怎样使用XML来操作Mybatis实现CRUD,可是大量的XML配置文件的编写是很烦人的.因此 Mybatis也提供了基于注解的配置方式,以下我们来演示一下使用接口加注解来实现CRUD的的 ...
- mysql存储过程,游标实例
CREATE DEFINER=`root`@`%` PROCEDURE `vir`.`task_payment_byonlinedown`()begin declare _mobile varchar ...
- 命令行能运行,但是在crontab不能正常运行的问题
今天配置了一个crontab,但是怎么也不能执行,原因是环境变量的问题,记录一下. 解决问题的办法,在shell脚本添加: ################## . /etc/profile . ~/ ...
- WIP 005 - Implement the search result page
Need to show the search result in a tablewalker You can show the tablewalker in the search page whic ...
- VB 求余求整
可以直接用函数来实现: 1.用CInt()函数的范围在-32,768 至 32,767,对于小数部分四舍五入 . 2.用Int()函数和Fix()函数都会删除参数的小数部份而返回剩下的整数, 不同之处 ...
- JSON语言规范与Java中两种解析工具基本使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html 一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...
- linux 端口转发
一 从一台机到另一台机端口转发 启用网卡转发功能#echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问192 ...