[原创]深入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的背景思想。

 

ExpandedBlockStart.gif 代码
.assembly  extern  mscorlib { auto }
.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

转载于:https://www.cnblogs.com/chinaeddy/archive/2010/05/30/1747404.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值