IL语言(一)-HelloWorld解析

来源:互联网 发布:淘宝起名符号 编辑:程序博客网 时间:2024/05/17 07:42

IL语言(也称为公共中间语言CIL,或微软中间语言MSIL)是.NET的核心,以.NET Framework平台运行的程序最终都是由IL代码实现。也可以这样理解,无论C/C++、BASIC、Pascal等语言特征如何,在INTEL芯片上最终执行的都是Intel汇编指令集。了解IL相关知识能够以较高层次理解.NET工作原理,最大程度利用.NET Framework进行高级程序开发。

1、能更好地理解托管代码内部运行机制,研究编译器生成的IL代码可以获得文档中没有涉及到的信息。

2、查看IL代码可以帮助调试或设计代码,以便于进行性能优化,理解各种常用语言所具有的优势。

3、直接采用IL语言编程有助于实现用其他语言无法实现的IL特性。

4、编写开发工具,如编译器或调试器,理解IL则是一个先决条件。

学习IL语言,首先需要学会使用两个工具,分别为ilasm.exe(MSIL 反汇编程序)和ildasm.exe(MSIL 反汇编程序)。通过该工具,我们可以打开任何.net可执行文件(exe或dll)并查看其MSIL代码。

ilasm是命令行程序,在/%System%/ Microsoft.NET /Framework /vn.nn.nn目录下。

  ilasm [options] filename [[options]filename...]
ildasm是图形程序,在/FrameworkSDK/vn.n/Bin/目录下。

符号

含义

更多信息

命名空间

接口

值类

枚举

方法

静态方法

字段

静态字段

事件

属性

清单或类信息项

Hello World程序是学习一门语言所接触的第一个程序,为了更好介绍IL语言格式,我根据Helloworld.il纯文本和ildasm反编译IL码解释IL语言。

//////////////////////////////////////////////////////////////////////////////////////////

//  Microsoft (R) .NET Framework IL Disassembler.  Version 1.1.4322.573
//  Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

// PE Header:
// Subsystem:                              00000003
// Native entry point address:    0000225e
// Image base:                             00400000
// Section alignment:                  00002000
// File alignment:                         00000200
// Stack reserve size:                  00100000
// Stack commit size:                  00001000
// Directories:                             00000010

//HelloWorld.il
//This is our first IL Program 

// 支持用//语法表示单行注释,用/* ...*/表示多行或部分注释


.assembly extern mscorlib{}     //指示此程序集代码引用的其他程序集。可以拥有多个extern指令。

.assembly HelloWorld               //指示汇编程序插入一个程序集清单
{
    .ver 1:0:1:0                          //程序集版本号。可以在花括号{}中包含其他信息(如公钥或程序集版本号)
}

.module HelloWorld.exe          //该指令声明一个模块,并指出存储该模块的文件名称

// MVID: {FC444559-FB26-4E01-88E6-BE721E6DFC5E}    Mvid是一个GUID表示此Module,其它域保留
.imagebase 0x00400000           //为影像基地址
.subsystem 0x00000003           //连接系统类型,0x00000003表示从控制台运行
.file alignment 512                  //文件对齐数值
.corflags 0x00000001                //指令设置运行库头文件标志.默认情况下,.corflags 指令指定值 1
// Image base: 0x07560000

.method static void Main() cil managed
{

.entrypoint                                     // 该指令定义程序的入口

// 方法在 RVA 0x2050 处开始
// 代码大小       11 (0xb)
.maxstack  1                                     //指出方法的计算栈需要多大空间
IL_0000:  ldstr      "Hello , World !"    //把字符串压入堆栈中

//调用静态System.Console.WriteLine方法

//方法参数引用栈顶元素,栈顶元素从栈中弹出。栈为空。
IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)

//从方法中返回,如栈顶为空则返回空,否则返回栈顶元素
IL_000a:  ret
}

///////////////////////////////////////////////////////////////////////////////////////

 

好累,终于写出第一节了,明天继续....

原创粉丝点击