Составители:
Рубрика:
.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
Common Intermediate Language
129
ве типа возвращаемого значения указывается void. Конструкторы всегда
имеют имя «.ctor», а статические конструкторы – «.cctor».
Список параметров метода следует за именем метода и заключается в
круглые скобки. Для каждого параметра указывается его тип и имя.
Прежде чем перейти к рассмотрению синтаксиса объявлений тел ме-
тодов, приведем несколько примеров заголовков методов:
1. Объявление конструктора с двумя параметрами.
.method public void .ctor
(int32 x, class [mscorlib]System.String s)
2. Виртуальный метод с управляемым указателем в качестве пара-
метра.
.method private virtual int32 myMethod(int32& pX)
3. Статический метод, возвращающий массив:
.method public static int32[] MyStaticMethod()
Тело метода заключается в фигурные скобки и содержит инструкции
языка CIL. Каждая инструкция записывается на новой строке программы.
Если нужно, то инструкции может предшествовать метка, отделяемая от
инструкции двоеточием. Например:
Hello: ldstr “Hello, World!”
call void [mscorlib]System.Console.WriteLine(string)
Кроме инструкций CIL тело метода может содержать директивы тела
метода. Они перечислены в таблице 3.54.
3.5.3. Пример программы
Давайте рассмотрим пример программы, написанной прямо на CIL с
использованием синтаксиса ILASM. Мы не станем приводить весь текст
программы сразу, а будем рассматривать ее постепенно, по частям.
Естественно, наша программа будет начинаться с заголовка, объявляю-
щего имена сборки и модуля и импортирующего стандартную библиотеку:
128
CIL и системное программирование в Microsoft .NET
Атрибут Описание
assembly Метод видим внутри сборки
family Метод видим для наследников типа
public Метод видим для всех
private Метод видим только внутри типа
abstract Метод является абстрактным
virtual Метод является виртуальным
final Метод не может переопределяться в наследниках
static Метод является статическим
Директива Описание
.entrypoint Показывает, что данный метод является точкой
входа в сборку (метод должен быть статиче-
ским, возвращать int32 или ничего не возвра-
щать, иметь в качестве параметров массив
строк или вообще не иметь параметров)
.locals (объявления) Определяет набор локальных переменных ме-
тода. Локальные переменные объявляются ана-
логично параметрам метода
.maxstack число Задает глубину стека вычислений
Таблица 3.53. Атрибуты методов Таблица 3.54. Директивы тела метода
128 CIL и системное программирование в Microsoft .NET Common Intermediate Language 129 Таблица 3.53. Атрибуты методов Таблица 3.54. Директивы тела метода Атрибут Описание Директива Описание assembly Метод видим внутри сборки .entrypoint Показывает, что данный метод является точкой family Метод видим для наследников типа входа в сборку (метод должен быть статиче- public Метод видим для всех ским, возвращать int32 или ничего не возвра- private Метод видим только внутри типа щать, иметь в качестве параметров массив abstract Метод является абстрактным строк или вообще не иметь параметров) virtual Метод является виртуальным .locals (объявления) Определяет набор локальных переменных ме- final Метод не может переопределяться в наследниках тода. Локальные переменные объявляются ана- static Метод является статическим логично параметрам метода .maxstack число Задает глубину стека вычислений ве типа возвращаемого значения указывается void. Конструкторы всегда имеют имя «.ctor», а статические конструкторы – «.cctor». .assembly Sample1 { } Список параметров метода следует за именем метода и заключается в .module sample1.exe круглые скобки. Для каждого параметра указывается его тип и имя. .assembly extern mscorlib { } Прежде чем перейти к рассмотрению синтаксиса объявлений тел ме- тодов, приведем несколько примеров заголовков методов: Далее объявим тип-значение Point, реализующий понятие точки на 1. Объявление конструктора с двумя параметрами. плоскости. Он будет содержать два поля x и y типа float64, а также констру- .method public void .ctor ктор и статический метод, вычисляющий расстояние между двумя точками: (int32 x, class [mscorlib]System.String s) .class public sealed Point extends [mscorlib]System.ValueType 2. Виртуальный метод с управляемым указателем в качестве пара- { метра. .field public float64 x .method private virtual int32 myMethod(int32& pX) .field public float64 y 3. Статический метод, возвращающий массив: .method public void .ctor (float64 x, float64 y) .method public static int32[] MyStaticMethod() { Тело метода заключается в фигурные скобки и содержит инструкции .maxstack 3 языка CIL. Каждая инструкция записывается на новой строке программы. ldarg.0 Если нужно, то инструкции может предшествовать метка, отделяемая от dup инструкции двоеточием. Например: ldarg.1 Hello: ldstr “Hello, World!” stfld float64 Point::x call void [mscorlib]System.Console.WriteLine(string) ldarg.2 Кроме инструкций CIL тело метода может содержать директивы тела stfld float64 Point::y метода. Они перечислены в таблице 3.54. ret } 3.5.3. Пример программы .method public static float64 Distance Давайте рассмотрим пример программы, написанной прямо на CIL с (valuetype Point a, valuetype Point b) использованием синтаксиса ILASM. Мы не станем приводить весь текст { программы сразу, а будем рассматривать ее постепенно, по частям. .maxstack 3 Естественно, наша программа будет начинаться с заголовка, объявляю- ldarga a щего имена сборки и модуля и импортирующего стандартную библиотеку: ldfld float64 Point::x
Страницы
- « первая
- ‹ предыдущая
- …
- 69
- 70
- 71
- 72
- 73
- …
- следующая ›
- последняя »