【问题标题】:Does a compiler have an assembler too?编译器也有汇编器吗?
【发布时间】:2010-06-20 17:29:58
【问题描述】:

我的理解是编译器将高级语言转换为机器代码。我有一个关于编译器(比如 VC++)是否也使用汇编器的问题?我记得每当发生崩溃或类似情况时,我都会看到汇编代码。

【问题讨论】:

  • 汇编程序只是机器指令(代码位)到一些助记符(如mov ax, bx)的一对一映射。这就是为什么您可以毫不费力地将汇编代码转换为机器代码并返回的原因。编译器做的工作要复杂得多,源代码和生成的代码之间没有一对一的关系(无论是直接的机器代码还是汇编指令)。这就是为什么你通常看不到二进制代码的源代码。
  • ony:用于非符号、非宏后端汇编程序。但即使是 GAS 输出也是象征性的。

标签: compiler-construction assembly


【解决方案1】:

这取决于编译器;许多编译器可以编译成汇编。例如,如果您将“-S”标志传递给 gcc,例如:

gcc -S -o test.S test.c

这会将您的 test.c 文件的程序集输出到您可以查看的文件 test.S 中。 (如果您要尝试读取程序集,我建议使用 -O0,因为那里的编译器优化可能会让您感到困惑)。

由于您在问题中提到了 Visual C++,Paul Dixon 在下面指出 Visual C++ 使用 the /FA flag 来完成同样的事情。

【讨论】:

  • 嗯,实际上,主要是 GCC 做的 :-) 大多数商业版本都内置了它以避免缓慢的生成/重新解析文本步骤,如果需要,只有一个选项来生成汇编程序。
【解决方案2】:

通常,编译器会将一种语言翻译成另一种语言。大多数编译器以机器代码为目标;以下是执行此操作的最常见方法,按从最低级别到最高级别的顺序排列:

  1. 通过包含每个指令集的后端直接生成机器代码。
  2. 生成汇编语言,将其传递给外部汇编器。这就是 gcc 所做的。毕竟,为什么不使用现有的汇编器呢?直接生成操作码很痛苦。
  3. 生成代码的低级中间形式,例如LLVM bytecode,将其转换为机器代码。 LLVM 是编译器编写者的天赐之物,因为它可以处理大量优化并支持大量后端,同时让您可以在比汇编更高的级别上编写代码。
  4. 将代码转换为类似 C 的语言,然后将其传递给另一个编译器。 Facebook does this to PHP:他们将其编译为 C++,然后使用 gcc 将其编译为程序集,由 GNU as 组装为本机代码。

如果您想尝试编写编译器,我建议您从 C 之类的东西作为后端开始。如果您想稍后获得更详细的信息,请尝试 LLVM。如果您尝试直接生成汇编语言或机器代码,它可能会比 C 编译器或 LLVM 生成的效率低。我是从这一次令人尴尬的个人经历中说出来的。

【讨论】:

    【解决方案3】:

    大多数编译器都可以选择查看程序集列表

    • 可以告诉VC输出带有/FA的汇编列表
    • 使用 gcc,使用 -S 开关

    【讨论】:

      【解决方案4】:

      编译器将一些高级编程语言翻译成一些低级语言(如机器代码、汇编甚至另一种高级语言,例如从 Vala 到 C,或从 uC++ 到 C++)。

      我不了解 VC++,但大多数编译器,因为 GNU GCC 不包含汇编程序,而是调用外部汇编程序(如 NASM 或 GNU AS)。

      干杯

      【讨论】:

        【解决方案5】:

        编译器直接编译成机器码。

        调试器会将机器代码指令显示为汇编程序,但调试器也可以显示编译器未编译的其他代码。

        编译器还可能包含一个汇编器,因此您可以在高级语言中包含内联汇编器代码或生成汇编器输出。

        【讨论】:

        • 不正确....我可以编写一个仅输出汇编源代码的编译器,以便与汇编器分开...此外,编译器几乎不会直接到机器代码...代码(!)的内部表示(不同于目标机器代码)对于进行优化等可能非常有用...好吧,一切可能都是隐藏的,但是“直接 “反正太多了! :D
        • 你只能回答 OP 的问题 Visual Studio 不输出汇编程序,然后调用 MASM 生成 exe
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2011-01-01
        • 2018-04-03
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多