C# 了解中间语言

C# understanding intermediate language

提问人:Skobo Do 提问时间:7/12/2023 最后编辑:Guru StronSkobo Do 更新时间:7/12/2023 访问量:86

问:

我是c#的新手。我目前正在遵循一些教程,并尝试学习如何使用 ildasm.exe 阅读中间语言 (IL)。

我用 c# 编写了这段简短的代码:

using System;

namespace MainApp
{
    class App
    {
        public static void Main()
        {
            int[] array1D = new int[4];
            int len = array1D.GetLength(0);
            //Console.WriteLine(array1D[1]);
        }
    }
}

然后,我编译了代码并得到了这个 il-code:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       17 (0x11)
  .maxstack  2
  .locals init (int32[] V_0,
           int32 V_1)
  IL_0000:  nop
  IL_0001:  ldc.i4.4
  IL_0002:  newarr     [System.Runtime]System.Int32
  IL_0007:  stloc.0
  IL_0008:  ldloc.0
  IL_0009:  ldc.i4.0
  IL_000a:  callvirt   instance int32 [System.Runtime]System.Array::GetLength(int32)
  IL_000f:  stloc.1
  IL_0010:  ret
} // end of method App::Main

我的问题: 第 7 行和第 8 行的意义何在?

C# 调试 编译 中间语言

评论

1赞 jdweng 7/12/2023
它正在将值推送到堆栈上以准备调用。调用的参数必须位于堆栈上。调用的参数位于堆栈指针之后。进行存储和加载是将项目放在堆栈上的最简单方法。
2赞 DonMiguelSanchez 7/12/2023
也许它对 stackoverflow.com/questions/44733675/ 有所帮助......
3赞 György Kőszeg 7/12/2023
它似乎是一个调试版本。在“发布”中,它们应该与 .nop
1赞 madreflection 7/12/2023
与 jdweng 的评论所暗示的相反,在这种情况下,“堆栈”不是堆栈指针遍历的内存缓冲区。相反,它是评估堆栈。IL 是一种基于堆栈的语言。每条指令都以某种方式在评估堆栈上运行,推送值、弹出值或两者兼而有之(或者在 的情况下两者都不是)。参数是在堆栈上传递,在寄存器中传递,还是在寄存器中传递,还是以其他方式传递,都取决于JIT编译器。nop
1赞 madreflection 7/12/2023
在阅读文档中的说明(如 stloc.0)时,请注意“堆栈转换行为”。这指示操作对评估堆栈的影响。在方法的开头,评估堆栈是空的,并且到最后必须为空,否则它就是一个“无效程序”。

答: 暂无答案