[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>初めてのIL

初めてのIL

初めましてこのサイトの管理人「利都」です。今回はプログラムの基礎である「HalloWorld」を行いたいと思います。

ソースコード

//.assembly extern mscorlib {} /*入れても入れなくても良い。*/
.assembly hello {}

.method static public void main() cil managed
{
    .entrypoint
    ldstr "Hello world!"
    call void [mscorlib]System.Console
                    ::WriteLine(class System.String)
    ret
}

実行結果は次のようになります。

I:\temp\msil>ilasm hello.il

Microsoft (R) .NET Framework IL Assembler. Version 1.1.4322.2032
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling 'hello.il' , no listing file, to EXE --> 'hello.EXE'
Source file is ANSI

Assembled global method main
Creating PE file

Emitting members:
Global Methods: 1;
Writing PE file
Operation completed successfully

I:\temp\msil>hello
Hello world!

簡単ですね。でも、私は初めからこれにたどり着いたわけではありませんでした。最初はC#のコードを逆アセンブルしてみました。

using System;

class Program
{
    public static void Main(string []argv)
    {
        Console.WriteLine("hello,world");
    }
}

上が元にしたC#のソースコードです。

I:\temp\msil>csc hello.cs
Microsoft(R) Visual C# .NET Compiler version 7.10.6001.4
for Microsoft(R) .NET Framework version 1.1.4322
Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.


I:\temp\msil>ildasm hello.exe /out=hello.il
// WARNING: Created Win32 resource file hello.res

コンパイル、逆アセンブル。出てきたコードは次のものです。

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

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )    // .z\V.4..
  .ver 1:0:5000:0
}
.assembly hello
{
  // --- 次のカスタム属性が自動的に追加されました。
  //                  コメントを外さないでください。 -------
  //  .custom instance void [mscorlib]
  //         System.Diagnostics.DebuggableAttribute::
  //                 .ctor(bool,bool) = ( 01 00 00 01 00 00 ) 
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module hello.exe
// MVID: {07292EED-4D10-4EBA-A03D-10531F539421}
.imagebase 0x00400000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
// Image base: 0x00d90000
//
// ============== CLASS STRUCTURE DECLARATION ==================
//
.class private auto ansi beforefieldinit Program
       extends [mscorlib]System.Object
{
} // end of class Program


// =============================================================


// =============== GLOBAL FIELDS AND METHODS ===================


// =============================================================


// =============== CLASS MEMBERS DECLARATION ===================
//   note that class flags, 'extends' and 'implements' clauses
//          are provided here for information only

.class private auto ansi beforefieldinit Program
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  
                             Main(string[] argv) cil managed
  {
    .entrypoint
    // コード サイズ       11 (0xb)
    .maxstack  1
    IL_0000:  ldstr      "hello,world"
    IL_0005:  call       void [mscorlib]
                               System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method Program::Main

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // コード サイズ       7 (0x7)
    .maxstack  1
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]
                                          System.Object::.ctor()
    IL_0006:  ret
  } // end of method Program::.ctor

} // end of class Program


// =============================================================

//*********** 逆アセンブリが完了しました ***********************
// WARNING: Created Win32 resource file hello.res

これだけしか見せなくても分かってしまう人もいるでしょう。ですが私はあんまりよく分かっていないので次回から色々と実験をしてみたいと思います。


ページの一番上へ
一覧に戻る 次のページへ
初版2006-4-4
[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>初めてのIL