简单的MSIL程序

Published on 2007 - 12 - 27

//昨天在看Apress.Expert的《dot.NET.2.0.IL.Assembler》
//发现书中的第一个例程就涉及到不少内容.因此将这个程序每一行都仔细的做了注释,发到这里做个tip

//外加几点tip
//1、MSIL只使用栈,是类汇编语言,没有寄存器的概念,所有参数都通过栈来传递.
//2、程序编译方式:ILasm.exe OddOrEven.il
//3、Windows SDK里有可以将.net程序反汇编成MSIL的程序ILDasm.exe.

//----------- Program header

.assembly extern mscorlib

{

auto

}

.assembly OddOrEven

{

}

.module OddOrEven.exe//程序名

//----------- Class declaration

.namespace Odd.or //定义命名空间Odd.or

{

.class public auto ansi Even extends [mscorlib]System.Object //定义类Even extends System.Object

{

//----------- Field declaration

.field public static int32 val //类成员变量public static int32 val .field表示定义类成员

//----------- Method declaration

.method public static void check( ) cil managed //定义check方法

{

.entrypoint

.locals init (int32 Retval) //局部变量 int32 Retval

AskForNumber:

ldstr "Enter a number" //装载字符串入栈 ldstr表示load string

call void [mscorlib]System.Console::WriteLine(string) //输出刚才入栈的字符串,参数用过后即pop

call string [mscorlib]System.Console::ReadLine () //读取用户输入,返回字符串入栈

ldsflda valuetype CharArray8 Format //将静态变量Format地址入栈,sflda表示stactic field load address

ldsflda int32 Odd.or.Even::val //将静态变量int32 Odd.or.Even::val地址入栈

call vararg int32 sscanf(string,int8*,...,int32*) //调用sscanf函数,通过PInvoke调用未托管代码

stloc Retval //将返回值存储进Retval中 stloc 意思是store local

ldloc Retval //将Retval入栈

brfalse Error //Retval为false则出错,跳至Error

ldsfld int32 Odd.or.Even::val //将静态变量Odd.or.Even::val入栈,sfld表示stactic field load

ldc.i4 1 //常量int32 1入栈 constant

and

brfalse ItsEven //为false则跳至ItsEven br表示break吧

ldstr "odd!"

br PrintAndReturn //无条件跳到 PrintAndReturn

ItsEven:

ldstr "even!"

br PrintAndReturn //无条件跳到 PrintAndReturn

Error:

ldstr "How rude!" //载入字符串"How rude!"

PrintAndReturn:

call void [mscorlib]System.Console::WriteLine(string) //输出字符串

ldloc Retval //Retval入栈

brtrue AskForNumber

ret //ret 表示 return

} // End of method

} // End of class

} // End of namespace

//----------- Global items

.field public static valuetype CharArray8 Format at FormatData //定义全局值类型 CharArray8 Format内容为FormatData

//----------- Data declaration

.data FormatData = bytearray(25 64 00 00 00 00 00 00) // % d . . . . . .

//----------- Value type as placeholder

.class public explicit CharArray8 extends [mscorlib]System.ValueType //定义值类型 CharArray8

{

.size 8

}

//----------- Calling unmanaged code

.method public static pinvokeimpl("msvcrt.dll"

cdecl) //从 microsoft vc 标准库里找sscanf

vararg int32 sscanf(string,

int8*) cil managed

{

}

Comments
Write a Comment