Я конвертирую код в IL (CIL/MSIL и т.д.) из С#. Я застрял на условных выражениях, потому что хочу иметь возможность сохранять данные в следующем доступном свободном местоположении. Пример:
var x = 0;
if(x > 20)
x = 1;
Console.WriteLine(x);
Если я преобразую это в то, что я считаю правильным IL, я получаю:
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.s 14
IL_0006: cgt
IL_0008: ldc.i4.0
IL_0009: ceq
IL_000B: stloc.1
IL_000C: ldloc.1
IL_000D: brtrue.s IL_0011
IL_000F: ldc.i4.1
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: call System.Console.WriteLine
Я считаю, что это правильный IL, но мой пример очень статичен. Если вы видите в коде IL, он сохраняет результат ceq в loc.1
И, таким образом, моя проблема - компилятор увидел, что loc.0 уже занят (переменная «x»), и использовал следующее свободное место, которое было 1. Моя цель - сделать это динамически, где данный метод может иметь переменную N перед условным.
Итак, наконец, вот мой вопрос: как мне из C# создать код операции, чтобы сказать «stloc.nextAvailable» и его эквивалентную нагрузку?
ceq
IL извлекает два верхних значения в оценочном стеке, сравнивает их, а затем помещает 1, если они равны, или 0, если они не равны. - person dlev   schedule 20.06.2012