Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
}
Первым шагом при размещении локальных переменных с помощью CIL является применение директивы
.locals
init
Отображение параметров на локальные переменные в CIL
Вы уже видели, каким образом объявляются локальные переменные в CIL с применением директивы
.locals init
public static int Add(int a, int b)
{
return a + b;
}
Такой с виду невинный метод требует немалого объема кодирования на языке CIL. Во-первых, входные аргументы (
а
b
ldarg
add
ret
ildasm.exe
.method public hidebysig static int32 Add(int32 a,
int32 b) cil managed
{
.maxstack 2
ldarg.0 // Загрузить а в стек.
ldarg.1 // Загрузить b в стек.
add // Сложить оба значения.
ret
}
Скрытая ссылка this
Обратите внимание, что ссылка на два входных аргумента (
а
b
0
1
Во время исследования или написания кода CIL нужно помнить о том, что каждый нестатический метод, принимающий входные аргументы, автоматически получает неявный дополнительный параметр, который представляет собой ссылку на текущий объект (подобно ключевому слову
this
Add()
<b>// Больше не является статическим!</b>
public int Add(int a, int b)
{
return a + b;
}
то входные аргументы
а
b
ldarg.1
ldarg.2
ldarg.0
ldarg.1
this
<b>// Это ТОЛЬКО псевдокод!</b>
.method public hidebysig static int32 AddTwoIntParams(
MyClass_HiddenThisPointer this, int32 a, int32 b) cil managed
{
ldarg.0 // Load MyClass_HiddenThisPointer onto the stack.
ldarg.1 // Load "a" onto the stack.
ldarg.2 // Load "b" onto the stack.
...
}
Представление итерационных конструкций в CIL
Итерационные конструкции в языке программирования C# реализуются посредством ключевых слов
for
foreach
while
do
for:
public static void CountToTen()
{
for(int i = 0; i < 10; i++)
{
}
}
Вспомните, что для управления прекращением потока выполнения, когда удовлетворено некоторое условие, используются коды операций
br
br
bltn
for
i
i
Также вспомните, что в случае применения любого кода операции CIL, предназначенного для ветвления, должна быть определена специфичная метка кода (или две), обозначающая место, куда будет произведен переход при истинном результате оценки условия. С учетом всего сказанного рассмотрим показанный ниже (отредактированный) код CIL, который сгенерирован утилитой
ildasm.exe
.method public hidebysig static void CountToTen() cil managed
{
.maxstack 2
.locals init (int32 V_0, bool V_1)
IL_0000: ldc.i4.0 // Загрузить это значение в стек.