WEB开发网
开发学院软件开发C语言 《C# to IL》第二章 IL基础 阅读

《C# to IL》第二章 IL基础

 2009-06-01 08:31:09 来源:WEB开发网   
核心提示: a.il.assembly mukhi {}.class private auto ansi zzz extends System.Object {.method public hidebysig static void vijay() il managed {.entrypoint.lo

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (int32 V_0,int64 V_1)
ldc.i4.6
stloc.0
ldc.i4.7
conv.i8
stloc.1
ret
}
}

在C#程序中,我们在Main函数中创建了2个变量i和j。它们是局部变量,是在栈上创建的。请注意,在转换到IL的过程中,变量的名称会被丢弃。

在IL中,变量通过locals伪指令来创建,它会把自身的名称分配给变量,以V_0和V_1等等作为开始。数据类型也会被修改——从int修改为int32以及从long修改为int64。C#中的基本类型都是别名。它们都会被转换为IL所能理解的数据类型。

当前的任务是将变量i初始化为值6。这个值必须位于磁盘上或计算栈上。做这个事情的指令是ldc.i4.value。i4就是从内存中获取4个字节。

在上面语法中提到的value,是必须要放置到栈上的常量。在值6被放置到栈上之后,我们现在需要将变量i初始化为这个值。变量i会被重命名为V_0,它是locals指令中的第一个变量。

指令stloc.0获取位于栈顶的值,也就是6,并将变量V_0初始化为这个值。初始化一个变量的过程是相当复杂的。

第2个ldc指令将7这个值复制到栈上。在32位的机器上,内存只能以32字节的块(Chunk)来分配。同样,在64位的机器上,内存是以64字节的块来分配的。

数值7被存储为一个常量并只需要4个字节,但是long需要8个字节。因此,我们需要把4字节转换为8字节。指令conv.i8就是用于这个意图的。它把一个8字节数字放在栈上。只有在这么做之后,我们才能使用stloc.1来初始化第2个变量V_1为值7。从而会有stloc.1指令。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:to IL 第二章

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接