【问题标题】:.NET Assembly language.NET 汇编语言
【发布时间】:2013-09-04 00:57:15
【问题描述】:

我了解反编译器和反汇编器 (A .net disassembler/decompiler) 之间的区别,即反汇编器允许您将机器代码转换为汇编语言(您可以在 Visual Studio 的反汇编窗口中看到),反编译器将汇编语言转换为高级语言,例如C#。

是否可以在文本文件中看到由 Jitter 生成的汇编代码(从反汇编窗口)?我怀疑不是因为它被优化为及时。

另外,就我的第一个问题而言,MSIL 是汇编语言还是高级语言?即在 .NET 中似乎有两种汇编语言,即 MSIL 和由 JITTER 生成的汇编语言,尽管我怀疑答案是 JITTER 生成机器代码,在 Dissassembly 窗口中将其格式化为汇编语言。

我已经花时间阅读这里的其他问题,但我没有找到答案。

【问题讨论】:

  • 这不是很有用,特别是因为反汇编窗口有一个错误显示呼叫地址错误。如果您想研究机器代码,请使用 C 编译器。与抖动生成的机器码差别不大。
  • @HansPassant,谢谢。我将在 CyGwin 编译器中使用 -S 开关。我想了解托管代码与较低级别的本机代码(例如 C 或 C++)有何不同。我意识到托管代码有一个垃圾收集器,但我不确定这如何使代码在较低级别(汇编语言或更低级别)上有所不同。
  • 正如 HansPassant 所提到的,一般来说,除了学术目的之外,这对所有用途都是无用的。所以,如果你只是想学习一些东西,那就去做吧!如果它是寻找错误或其他东西的探险的一部分,那么你可能走得太远了。狩猎愉快!

标签: .net jit cil


【解决方案1】:

我认为理解这里的定义很重要(看起来你大多这样做,这只是为了确保)。

首先,汇编语言:这只是任何人类可读的语言,其中每条语句都直接编译为某些机器代码(例如 x86 机器代码或 .Net 字节码)中的指令。

基于此,反汇编程序是一个逆向编译的程序:它将机器代码转换为相应的汇编语言。

反编译器将机器码转换成另一种语言。

也许所有选项的图像(包括反/编译 C/C++ 和假设 x86 计算机)会有所帮助:

现在,针对您的具体问题:

是否可以在文本文件中看到由 Jitter 生成的汇编代码(从 Dissassembly 窗口)?

从理论上讲,没有理由不应该这样做(尤其是考虑到 NGEN)。实际上,我不知道有任何此类工具。

就我的第一个问题而言,MSIL 是汇编语言还是高级语言?

我会说它是一种高级汇编语言。它当然是一种汇编语言,而且它也比普通的汇编语言更高级。

【讨论】:

  • 谢谢。 +1 图表。
  • 是的,我认为这里的“误称”是“汇编”语言。更准确地说,应该说如图所示的“机器代码”。这消除了所有的困惑,因为很明显,MSIL 不是物理机器代码(它被认为是虚拟机代码,因此像 Java JVM 或 .NET mscoree.dll 之类的东西是“用于 JIT 编译和执行生成的字节码的虚拟机)尽管(可以说)它可以被认为是一种“汇编”语言。很好的答案。
  • @fourpastmidnight 好吧,它现在不是物理机器代码,但将来可能会改变。例如,there are CPUs that can execute Java bytecode 和 .Net 字节码也可以这样做。
  • @svick:啊,这真的很有趣。谢谢你的信息。但是,对于手头的讨论,我想我说的是“相当正确”。再次感谢您的链接!
【解决方案2】:

IL/MSIL 是一种针对 .NET 虚拟机的汇编语言 :-) 反汇编窗口显示程序在 jitted 后的汇编语言,因此是“真正的”CPU(通常是 Intel)的汇编语言。

通过使用ngen,您可以将您的.NET 应用程序compile 转换为“本机”机器代码。从那里您可能可以使用“标准”反汇编程序来观察它。

【讨论】:

  • 你有关于反汇编生成代码的详细信息吗?我不确定它是否像你说的那么简单。
  • @svick 可能 idapro 有一个导出到 txt 文件的选项,或者至少你可以在记事本上选择、复制、粘贴...试试developingthefuture.net/…stackoverflow.com/questions/4565796/…
  • 我认为您需要将您的 ngen 程序集加载到调试器/反汇编器中,以及 mscoree.dll(这是 .NET Core 运行时执行引擎,例如 JITter)。据我所知,这并不像怪物 VB6 那样困难!! (但我确信这仍然不容易)。此外,请注意,根据运行 .NET 代码的机器,通过 ngen 输出的字节可能并不总是完全相同。 .NET 具有非确定性 MSIL -> 机器代码编译。
猜你喜欢
  • 2010-12-24
  • 2014-10-07
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多