MSIL教程

更新时间:2023-11-05 10:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基本概念

微软中间语言(MSIL) 是一种语言,是许多编译器(C#,VB.NET等)的输出 中间语言反汇编器(ILDasm) 让用户以人可阅读的格式查看MSIL代码。

DotNet可执行文件(dll或exe) MSIL代码 ILDasm

中间语言编译器(ILAsm) 从MSIL语言生成可执行文件

MSIL代码 DotNet可执行文件(dll或exe) ILAsm 存放路径: WINNT \\ Microsoft.NET \\Framework \\vn.nn.nn 语言参考

所有MSIL指令的说明

FrameworkSDK\\Tool Developers Guide\\docs\\Partition II Metadata.doc MSIL命令的完整列表

FrameworkSDK\\Tool Developers Guide\\docs\\Partition III CIL.doc

一般信息

在MSIL中,所有的操作都在栈上完成。当调用一个函数的时候,其参数和局部变量都被分配到栈上。函数的代码从该栈开始,把一些值压入栈,对这些值进行一些操作,从栈上取出值。

执行MSIL命令和函数由3个步骤完成

Step1 把命令操作数和函数参数压入栈(ld命令)。

Step2 执行命令或者调用函数。命令或函数从栈中取出他们的操作数(参数)并把他们压入结果栈(返回值)。

Step3 从栈中读取结果值(st命令)。

注意:上面的步骤是可选的,例如void函数不会压入一个结果值到栈。 栈包含值类型对象和引用类型对象 引用类型对象本身保存在堆中

示例项目

打印字符串 用到的MSIL指令

.entrypoint 定义程序的入口点,该函数在程序启动的时候由.NET 运行库调用 .maxstack 定义函数代码所用堆栈的最大深度。

用到的MSIL命令

ldstr string 把一个字符串常量装入堆栈。

call function(parameters) 调用静态函数,函数的参数必须在函数调用前装入堆栈。 pop 取出栈顶的值,当我们不需要把值存入变量时使用。 ret 从一个函数中返回。

.assembly PrintString {} /*

Console.WriteLine(\ */

.method staticpublicvoid main() il managed {

.entrypoint // 该函数是程序的入口 .maxstack 8

// ***************************************************** // Console.WriteLine(\\

// ***************************************************** ldstr \ // 把字符串压入堆栈 // 调用静态的System.Console.Writeline函数 // (函数移除栈顶的字符串)

call void [mscorlib]System.Console::WriteLine (class System.String)

// *****************************************************

ldstr \Enter to continue\

call void [mscorlib]System.Console::WriteLine (class System.String) // 调用 System.Console.Read 函数

call int32 [mscorlib]System.Console::Read() // pop 指令移除栈顶元素 // (移除由Read()函数返回的数字 pop

// ***************************************************** ret }

赋值

该程序给一个变量赋与int值并把它打印到控制台窗口

用到的MSIL命令

ldc.i4.n 把一个 32位的常量(n从0到8)装入堆栈

stloc.n 把一个从堆栈中返回的值存入第n(n从0到8)个局部变量

.assembly XequalN {} // int x; // x = 7;

// Console.WriteLine(x);

.method staticpublicvoid main() il managed {

.entrypoint .maxstack 8

.locals init ([0] int32 x) // 分配一个局部变量

// ***************************************************** // x = 7;

// *****************************************************

ldc.i4.7 // 把常量装入堆栈

stloc.0 // 把堆栈中的值存入第0个变量

// ***************************************************** // Console.WriteLine(x);

// ***************************************************** ldloc.0 // 把第0个变量转入堆栈

call void [mscorlib]System.Console::WriteLine(int32) ret }

数据运算

本程序从控制台读取2个数字,对它们进行简单的运算,然后显示结果。

要用到的MSIL命令

add 2个值相加。命令的参数必须在调用前装入堆栈,该函数从堆栈中移除参数并把运算后的结果压入堆栈。 sub 2个值相减。 mul 2个值相乘。

.assembly Operations {} /*

// 程序的C#代码: int x, y, z; string s;

Console.WriteLine(\x:\ s = Console.ReadLine(); x = Int32.Parse(s);

Console.WriteLine(\y:\ s = Console.ReadLine();

y = Int32.Parse(s);

z = x + y;

Console.Write(\+ y = \ Console.Write(z); Console.WriteLine(\

z = x - y;

Console.Write(\- y = \ Console.Write(z); Console.WriteLine(\

z = x * y;

Console.Write(\* y = \ Console.Write(z); Console.WriteLine(\ */

.method staticpublicvoid main() il managed {

.entrypoint .maxstack 8

.locals init ([0] int32 x, [1] int32 y, [2] int32 z, [3] string s)

// ***************************************************** // Console.WriteLine(\x:\

call void [mscorlib]System.Console ::WriteLine(string)

leave.s END_TRY_CATCH // 退出catch块 }

END_TRY_CATCH: ret }

本文来源:https://www.bwwdw.com/article/7q82.html

Top