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

dst*_*sta 6 c# assembly code-generation gnu-assembler

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

Dav*_*eli 9

您可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

其产生: 在此输入图像描述


Dmi*_*nov 5

C# 代码编译为 MSIL(MS 中间语言),它实际上并不是从 C 编译器获得的真正的 asm 代码。详细了解 .NET Framework 应用程序如何运行。

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


per*_*man 4

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

更有可能的是,您可能想要查看比 CPU 汇编代码级别更高的字节码,您可以通过在编译的C# 程序上使用ILdasm来完成此操作。.exe