简单的MSIL程序
//昨天在看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
{
}