【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 ... ...
随机推荐
- Eclipse Maven项目报错2之A child container failed during start
问题:在同事那里拿了一个Eclipse的maven项目,导入报错,主要显示的是A child container failed during start 具体错误如下 六月 02, 2018 12:0 ...
- Android中使用Handler以及CountDownTimer实现包括倒计时的闪屏页面
上一篇博文<Android中Handler使用浅析>通过实现倒计时闪屏页面的制作引出了Handler的用法以及实现原理,博文末尾也提到了实现过程中的Bug,有兴趣的朋友能够点击链接回去看看 ...
- artTemplate--使用artTemplate时,由于json对象属性有特殊格式 导致调用报错artTemplate,syntax error,Template Error
我们首先看下面的代码 data = { "siteName" : "西部云谷二期17", "PM10" : "10017" ...
- 一些常用&实用的Linux命令
这些指令还是很常用的,最起码有些我每天都要用.当然,很多东西还是写成shell脚本用起来更方便. man 命令(查看一个命令的详细帮助信息) 命令 --help(显示一个命令的简单帮助信息) 命令 | ...
- Linux 远程和本地的一些解决方式
有的小伙伴想Linux 远程登录 两台机器同一时候root登录.事实上能够同一时候多个用户的. Linux是多用户的多任务系统,能够同一时候多个用户登录到系统,也能够一个用户通过不同终端登录到一个系 ...
- Windows 下 Git 安装与初始配置
官方下载地址:https://git-scm.com/download/win,我下载的最新版是 Git-2.15.1.2-64-bit.exe . Windows 下安装步骤 1.相关信息,直接“ ...
- linux 查看网线断开 网卡是否关闭
linux 查看网线断开 网卡是否关闭 探测是否存在网络接口: SIOCGIFFLAGS
- websocket与canvas[转]
server端还是用tomcat7的方式客户端 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- 很赞的idea教程
感谢: http://pan.baidu.com/s/1dDEaVxn