从C#代码生成汇编代码?

9

有没有办法从C#代码生成汇编代码?我知道用GAS可以实现C代码的汇编,但是否有人知道是否能够用C#实现此功能?


我不清楚你的问题是什么。你想将你的C#编译成汇编代码,还是想编写一个输出汇编代码的C#程序? - perelman
我想查看我的C#代码在汇编中的样子,出于教育目的。我现在正在学习汇编课程。 - dsta
4个回答

8
你可以使用 printAsm 标志设置为 true 的 BenchmarkDotNet
[DisassemblyDiagnoser(printAsm: true, printSource: true)] // !!! use the new diagnoser!!
[RyuJitX64Job]
public class Simple
{
    int[] field = Enumerable.Range(0, 100).ToArray();

    [Benchmark]
    public int SumLocal()
    {
        var local = field; // we use local variable that points to the field

        int sum = 0;
        for (int i = 0; i < local.Length; i++)
            sum += local[i];

        return sum;
    }

    [Benchmark]
    public int SumField()
    {
        int sum = 0;
        for (int i = 0; i < field.Length; i++)
            sum += field[i];

        return sum;
    }
}

这将生成: 在此输入图像描述


5

C#代码编译成MSIL(MS中间语言),这实际上并不是从C编译器获得的汇编代码。了解更多关于.NET Framework应用程序运行的信息。

如果你想查看生成的IL代码,请参考此问题


4

C#通常编译为.NET字节码(称为CIL或MSIL),然后在程序实际运行时进行JIT(“即时”)编译为本机代码。有一些C#的预编译器,例如Mono的AOT,因此您可能可以通过其中之一编译C#程序,然后对其进行反汇编。结果可能会很难理解。

更有可能的是,您可能希望查看字节码,这些字节码比CPU的汇编代码略高级,您可以通过对已编译的C#程序的.exe使用ILdasm来实现。


2

你可以采用一种间接的方式,使用NGEN工具生成二进制文件,然后对其进行反汇编。另外,你也可以使用调试器来检查由MSIL创建的JIT代码,Ollydbg 2是这样一个能够做到这一点的调试器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接