从 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# 代码生成汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章