Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 72 стр.

UptoLike

ilasm sample1.il
Мы получим следующее сообщение от компилятора ILASM:
Microsoft (R) .NET Framework IL Assembler. Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Assembling 'sample1.il', no listing file, to EXE --> 'sample1.EXE'
Source file is ANSI
Assembled method Point::.ctor
Assembled method Point::Distance
Assembled method SampleClass::Demo
Creating PE file
Emitting members:
Global
Class 1 Fields: 2; Methods: 2;
Class 2 Methods: 1;
Resolving member refs: 9 -> 9 defs, 0 refs
Writing PE file
Operation completed successfully
Итак, наша программа успешно откомпилировалась и на диске поя-
вилась сборка sample1.exe. Попробуем провести ее верификацию:
peverify sample1.exe
В ответ верификатор выведет на экран:
Microsoft (R) .NET Framework PE Verifier Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
All Classes and Methods in sample1.exe Verified
Таким образом, сборка успешно прошла верификацию и мы можем
рискнуть ее запустить:
sample1.exe
В результате на экран выводится расстояние между точками
(0.0,0.0) и (1.0,1.0):
1,4142135623731
Common Intermediate Language
131
ldarga b
ldfld float64 Point::x
sub
dup
mul
ldarga a
ldfld float64 Point::y
ldarga b
ldfld float64 Point::y
sub
dup
mul
add
call float64 [mscorlib]System.Math::Sqrt(float64)
ret
}
}
А теперь объявим вспомогательный класс SampleClass, который будет
содержать точку входа в нашу сборку. Метод Demo (точка входа) будет вы-
числять расстояние между точками (0.0,0.0) и (1.0,1.0) и выводить ре-
зультат на экран:
.class public SampleClass
{
.method public static void Demo()
{
.entrypoint
.maxstack 3
ldc.r8 0.0
ldc.r8 0.0
newobj void Point::.ctor(float64,float64)
ldc.r8 1.0
ldc.r8 1.0
newobj void Point::.ctor(float64,float64)
call float64 Point::Distance(valuetype Point, valuetype Point)
call void [mscorlib]System.Console::WriteLine (float64)
ret
}
}
Откомпилируем нашу программу, которая записана в текстовом фай-
ле sample1.il. Подразумевается, что мы работаем в Windows и у нас пере-
менная окружения path настроена таким образом, что программы ILASM и
PEVERIFY можно вызывать без указания путей. Наберем в консоли команду:
130
CIL и системное программирование в Microsoft .NET
130                          CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                         131


            ldarga       b                                                            ilasm sample1.il
            ldfld        float64 Point::x
            sub                                                                       Мы получим следующее сообщение от компилятора ILASM:
            dup
            mul                                                                       Microsoft (R) .NET Framework IL Assembler. Version 1.1.4322.573
            ldarga       a                                                            Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
            ldfld        float64 Point::y                                             Assembling 'sample1.il', no listing file, to EXE --> 'sample1.EXE'
            ldarga       b                                                            Source file is ANSI
            ldfld        float64 Point::y
            sub                                                                       Assembled method Point::.ctor
            dup                                                                       Assembled method Point::Distance
            mul                                                                       Assembled method SampleClass::Demo
            add                                                                       Creating PE file
            call         float64 [mscorlib]System.Math::Sqrt(float64)                 Emitting members:
            ret                                                                       Global
            }                                                                         Class 1 Fields: 2;   Methods: 2;
     }                                                                                Class 2 Methods: 1;
     А теперь объявим вспомогательный класс SampleClass, который будет                Resolving member refs: 9 -> 9 defs, 0 refs
содержать точку входа в нашу сборку. Метод Demo (точка входа) будет вы-               Writing PE file
числять расстояние между точками (0.0,0.0) и (1.0,1.0) и выводить ре-                 Operation completed successfully
зультат на экран:
     .class public SampleClass                                                       Итак, наша программа успешно откомпилировалась и на диске поя-
     {                                                                           вилась сборка sample1.exe. Попробуем провести ее верификацию:
       .method public static void Demo()
       {                                                                              peverify sample1.exe
         .entrypoint
         .maxstack 3                                                                  В ответ верификатор выведет на экран:
         ldc.r8    0.0
         ldc.r8    0.0                                                                Microsoft (R) .NET Framework PE Verifier Version 1.1.4322.573
         newobj    void Point::.ctor(float64,float64)                                 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
         ldc.r8    1.0
         ldc.r8    1.0                                                                All Classes and Methods in sample1.exe Verified
         newobj    void Point::.ctor(float64,float64)
         call      float64 Point::Distance(valuetype Point, valuetype Point)         Таким образом, сборка успешно прошла верификацию и мы можем
         call      void [mscorlib]System.Console::WriteLine (float64)            рискнуть ее запустить:
         ret
          }                                                                           sample1.exe
     }
     Откомпилируем нашу программу, которая записана в текстовом фай-                  В результате на экран выводится расстояние между точками
ле sample1.il. Подразумевается, что мы работаем в Windows и у нас пере-          (0.0,0.0) и (1.0,1.0):
менная окружения path настроена таким образом, что программы ILASM и
PEVERIFY можно вызывать без указания путей. Наберем в консоли команду:                1,4142135623731