VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 汇编语言 >
  • 深入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的背景思想。

 

复制代码
代码
.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汇编语言,欢迎关注
转载自 https://www.cnblogs.com/chinaeddy/archive/2010/05/30/1747404.html

相关教程