我正在将代码从 C# 转换为 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 ”并且它是等效的负载?