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

Posted

技术标签:

【中文标题】从 C# 代码生成汇编代码?【英文标题】:Generating assembly code from C# code? 【发布时间】:2012-03-04 01:40:40 【问题描述】:

有没有办法我知道使用 GAS 的 C 代码是可能的,但是有人知道 C# 是否可能吗?

【问题讨论】:

我不清楚你在问什么。你想把你的 C# 编译成汇编还是想写一个输出汇编的 C# 程序? 我想查看我的 C# 代码在汇编中的样子。出于教育目的。马上上汇编课。 【参考方案1】:

您可以使用 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;
    

产生:

【讨论】:

【参考方案2】:

C# 通常编译为 .NET 字节码(称为 CIL or MSIL),然后在程序实际运行时将 JIT(“及时”)编译为本机代码。有像Mono's AOT 这样的 C# 提前编译器,因此您可以通过其中一个编译 C# 程序,然后反汇编它。结果可能很难理解。

更有可能的是,您可能希望查看比 CPU 的汇编代码更高级别的字节码,您可以通过在 C# 程序的已编译 .exe 上使用 ILdasm 来做到这一点。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于从 C# 代码生成汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 访问数学协处理器

在 Visual Studio 中查看反汇编代码

如何使用嵌入在 C++ 中的单声道编译 C# 代码?

从汇编代码和骨架 C 导出数组的大小

为啥从 constexpr 引用生成的汇编代码与 constexpr 指针不同?

试图从 g++ 中理解简单的反汇编代码