C编译器是否编译为通用程序集?

时间:2011-09-26 16:12:47

标签: assembly compilation

我在计算机组织课程中,我们正在编写程序员。但是,由于这是一个类,我没有对任何事物或任何现实世界的使用有更广泛的认识。我们正在使用Altera的Nios II汇编语言。教授没有告诉我们当前生产中使用哪种汇编语言,语义是什么,或者C代码如何编译成所有汇编语言。

在简短的介绍之后,我是否正确假设C代码编译成几种汇编语言?如果是这样,它可以做什么来实现所有这些汇编语言 - 将其解析为通用汇编语言,然后从那里翻译它?或者是否有针对每种不同汇编语言的单独流程?

2 个答案:

答案 0 :(得分:7)

根本不需要将C编译到任何特定程序集或任何程序集,这些程序集留给编译器的实现者,而不是语言规范的一部分。通常,每个CPU制造商都会开发一个C编译器来定位他们的特定架构。

虽然有更多的通用编译器,如GCC和Clang,它们可以针对许多不同的指令集。

以Clang为例,它基于Low Level Virtual Machine,它是一个带有“中间表示”语言的抽象机器,LLVM IR。为LLVM可以将LLVM IR转换为指令集的每个体系结构编写后端,然后编译为LLVM IR的任何编译器都可以针对LLVM支持的CPU。

编译器将根据您传递给它的参数决定在运行时定位哪个后端。编译器通常有一个默认的后端,在构建编译器本身时通过配置(可能默认为你正在构建编译器的架构)来设置。

GCC可能使用类似的方法和一些中间表示,但我不确定细节。还有一个GCC后端也可以针对LLVM。

答案 1 :(得分:3)

C可以转换为编译器支持的任何类型的汇编程序。是否存在中间表示也取决于编译器。

请注意,如果您在C代码中编写直接汇编程序(例如,您在C中编写硬件驱动程序但需要执行一些非常低级的东西),那么您已将代码锁定到该特定平台汇编语言。 C(和编译器)将 NOT 使用嵌入式x86汇编程序获取一些代码并将其转换为(比如说)MIPS或PPC。