编译器也有汇编程序吗?

时间:2010-06-20 17:29:59

标签: compiler-construction assembly

我的理解是编译器将高级语言转换为机器代码。我有一个问题,编译器(比如VC ++)是否也使用汇编程序?我记得看到汇编代码,无论何时发生崩溃或类似事件。

5 个答案:

答案 0 :(得分:5)

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

gcc -S -o test.S test.c

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

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

答案 1 :(得分:3)

通常,编译器会将一种语言翻译成另一种语言。大多数编译器都针对机器代码;以下是从最低级别到最高级别的最常见方式:

  1. 直接生成机器代码,包括每个指令集的后端。
  2. 生成汇编语言,传递给外部汇编程序。这就是gcc所做的。毕竟,为什么不使用现有的汇编程序?直接生成操作码很痛苦。
  3. 生成代码的低级中间形式,例如LLVM bytecode,它将转换为机器代码。 LLVM是编译器编写者的天赐之物,因为它处理大量优化并支持大量后端,同时让你的编写级别高于汇编。
  4. 将代码转换为C语言,然后将其传递给另一个编译器。 Facebook does this to PHP:他们将它编译为C ++,然后使用gcc将其编译为程序集,由GNU编译为本机代码。
  5. 如果您想尝试编写编译器,我建议您从像C这样的后端开始。如果您想稍后更详细,请尝试LLVM。如果您尝试直接生成汇编语言或机器代码,它可能不如C编译器或LLVM产生的效率低。我在这个问题上发表令人尴尬的个人经历。

答案 2 :(得分:1)

编译器直接转到机器代码。

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

编译器还可能包含汇编程序,因此您可以使用更高级语言包含内联汇编程序代码或生成汇编程序输出。

答案 3 :(得分:1)

大多数编译器都可以选择查看汇编列表

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

答案 4 :(得分:0)

编译器将某些高级编程语言翻译成某种低级语言(例如机器代码,汇编语言或其他高级语言,例如从Vala到C,或从uC ++到C ++)。

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

干杯