[原创]深入C#内核 IL汇编语言 (1) by Eddy
首先 我们先了解下几个名词
CLR : Common Language Runtime 公共语言运行库
它在.Net应用程序和底层操作系统之间提供了一个操作层。这个操作层可供.Net应用程序使用的运行时环境。
打个比方 我们要写c语言的时候,c语言会编译成汇编语言,汇编语言在去编译成机器语言Cpu指令执行,那么汇编语言就类似于这个CLR,但这个比喻仅仅是比喻,供大家简单理解CLR,区别实际上CLR并不是解释器。
CLS : Common Language Specification 公共语言运行规范
它保证了.Net应用程序的互操作性,被称为公共语言运行规范,CLS限制了命名约定、数据类型、函数类型以及某些其他元素,为不同语言提供了一个公共标准。
打个比方 我们在VB.Net里命名MyField和Myfield、myfield其实是一个变量,不区分大小写并可以写在类的外全局变量。但C#却不可以。这个就是规范干的事,不同语言有不同的规范,C#,VB.Net ,F# ,J# ,等.Net大家族每个成员都有其规范,最后规范解释过后,会编译相同的语种,至于这个语种是什么,呵呵,你知道的。
CLI : Common Language Infrastrucure 公共语言基础结构
它是ECMA国际化和ISO标准的一部分描述,描述了其语言基础结构。
metadata : 元数据
managed code : 托管代码
上面两个皆为CLR的组成部分。
元数据 是应用程序所有结构项 类、类成员、类特性、全局项等的描述符及它们的关系所组成的一套系统。
托管代码 表示了应用程序的方法功能,他们以微软中间语言或公共中间语言的抽象二进制形式进行编码。好了,终于,我们抛出了此文的中心:
MSIL : Microsoft intermediate language 微软中间语言
CIL : common intermediate language 公共中间语言
它们统称 IL 中间语言。
IL代码由CLR 帮忙“托管” 。CLR托管至少包括三个主要的活动:类型控制、结构化异常处理和垃圾收集。
类型控制 涉及在执行期间项类型的验证和转换。
托管异常处理 在功能上与 非托管的结构化异常处理类似,但它是由CLR执行的而不是由操作系统执行的。
垃圾收集 涉及对不再使用的对象进行自动标识和释放。(当然 智能设备 除外,暂时没有垃圾收集功能)
在CLR环境下,.Net应用程序由一个或多个托管可执行体组成,其中每一个都携带着元数据和托管代码,托管代码是可选的,但至少要带有元数据,如果都没有。那你写这个就可以去吃屎了。托管的.Net应用程序称为程序集。托管的可执行体称为Module。每个程序集包含一个主模块,这个模块是什么?呵呵,你知道的。
托管可执行体的两个主要组件:元数据和IL代码。CLR处理这两个组件的主要子系统是加载程序(loader)和JIT(just-in-time 即时)编辑器。
好了,打的手都酸了,在打下去浪费馒头,现在给大家讲讲IL吧,上面的不是废话,提供你IL的背景思想。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
.assembly AndCount { }
.module andCount.exe
.namespace AndCount {
.class public AndCount extends [mscorlib]System.Object{
.method public static void AddCount() cil managed {
.entrypoint
.locals init (int32 retValue)
.try{
AskAfterNum:
ldstr "-------------------------------------------------------\n加法载入"
call void [mscorlib]System.Console::Write(string)
ldstr "\n请输入第一个数字:"
call void [mscorlib]System.Console::Write(string)
call string [mscorlib]System.Console::ReadLine()
call int32 [mscorlib]System.Convert::ToInt32(string)
ldstr "\n请输入第二个数字:"
call void [mscorlib]System.Console::Write(string)
call string [mscorlib]System.Console::ReadLine()
call int32 [mscorlib]System.Convert::ToInt32(string)
add
stloc retValue
ldloc retValue
brfalse Error
ldstr "计算完毕,结果为"
call void [mscorlib]System.Console::WriteLine(string)
ldloc retValue
br PrintCount
Error:
ldstr "error"
PrintCount:
call void [mscorlib]System.Console::WriteLine(int32)
ldloc retValue
brtrue AskAfterNum
}
catch [mscorlib]System.Exception
{
pop
ldstr "\n临时错误!\n"
call void [mscorlib]System.Console::Write(string)
br AskAfterNum
}
ret
}
}
}
.field public static valuetype CharArray8 Format at FormatData
.data FormatData = bytearray(25 64 00 00 00 00 00 00)
.class public explicit CharArray8
extends [mscorlib]System.ValueType { .size 8 }
.method public static pinvokeimpl("msvcrt.dll" cdecl)
vararg int32 sscanf(string,int8*) cil managed{ }
将其保存为test.il,并保存编译后执行
例如 保存在D:\test.il 打开cmd 执行ilasm d:\test.il 即可生成test.exe,执行看看结果吧
代码是个大草莓,下一篇我会详细讲讲IL汇编语言,欢迎关注
本文章只供学习,切勿转载!切记切记(转载也厚道点写个出处,谢谢哈)
by Eddy 2010.05.30