Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 7:

Язык CIL: обработка исключений. Синтаксис ILASM

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >

Пример программы

Давайте рассмотрим пример программы, написанной прямо на CIL с использованием синтаксиса ILASM. Мы не станем приводить весь текст программы сразу, а будем рассматривать ее постепенно, по частям.

Естественно, наша программа будет начинаться с заголовка, объявляющего имена сборки и модуля и импортирующего стандартную библиотеку:

.assembly Sample1 { }
.module sample1.exe
.assembly extern mscorlib { }

Далее объявим тип-значение Point, реализующий понятие точки на плоскости. Он будет содержать два поля x и y типа float64, а также конструктор и статический метод, вычисляющий расстояние между двумя точками:

.class public sealed Point extends [mscorlib]System.ValueType
{
    .field public float64 x
    .field public float64 y
    .method public void .ctor (float64 x, float64 y)
    {
      .maxstack		3
      ldarg.0
      dup
      ldarg.1
      stfld  		float64 Point::x
      ldarg.2
      stfld  		float64 Point::y
      ret
    }
    .method public static float64 Distance
      (valuetype Point a, valuetype Point b)
    {
      .maxstack 	3
      ldarga  		a
      ldfld  		float64 Point::x
      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 можно вызывать без указания путей. Наберем в консоли команду:

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
< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek