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

时间:2012-02-12 07:37:30

标签: c# assembly code-generation gas

有没有办法从C#代码生成汇编代码?我知道使用GAS的C代码是可能的,但是有人知道C#是否可以使用?#/ p>

4 个答案:

答案 0 :(得分:3)

C#通常编译为.NET字节码(称为CIL or MSIL),然后在实际运行程序时编译为本机代码的JIT(“及时”)。 C#之前存在编译器,如Mono's AOT,因此您可以通过其中一个编译C#程序,然后对其进行反汇编。结果可能很难遵循。

更有可能的是,您可能希望查看比CPU的汇编代码更高级别的字节码,您可以在C#程序的已编译.exe上使用ILdasm。< / p>

答案 1 :(得分:3)

C#代码编译成MSIL(MS中间语言),这实际上并不是你从C编译器获得的asm代码。阅读有关.NET Framework应用程序如何运行的更多信息。

如果您想查看生成的IL代码,请参阅this question

答案 2 :(得分:2)

您可以使用NGEN工具以间接方式执行此操作,然后反汇编生成的二进制文件。或者,您可以使用调试器来检查从MSIL创建的JIT代码,Ollydbg 2是一个能够执行此操作的调试器。

答案 3 :(得分:2)

您可以使用BenchmarkDotNet并将printAsm标志设置为true。

[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;
    }
}

哪个产生: enter image description here