Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly C编译器编译成泛型程序集吗?_Assembly_Compilation - Fatal编程技术网

Assembly C编译器编译成泛型程序集吗?

Assembly C编译器编译成泛型程序集吗?,assembly,compilation,Assembly,Compilation,我在上计算机组织课,我们在汇编程序。然而,由于这是一个类,我对任何东西都没有更广泛的理解,也没有任何实际的用途。我们正在使用Altera的NIOSII汇编语言。教授没有告诉我们当前生产中使用了哪些汇编语言,语义是什么,或者C代码如何编译成所有的汇编语言 在简短的介绍之后,我是否正确地假设有几种C代码编译到的汇编语言?如果是这样的话,它是如何达到所有这些汇编语言的?将其解析为通用汇编语言,然后从那里进行翻译?或者每种不同的汇编语言都有一个单独的过程吗?C可以转换成编译器支持的任何类型的汇编程序。是

我在上计算机组织课,我们在汇编程序。然而,由于这是一个类,我对任何东西都没有更广泛的理解,也没有任何实际的用途。我们正在使用Altera的NIOSII汇编语言。教授没有告诉我们当前生产中使用了哪些汇编语言,语义是什么,或者C代码如何编译成所有的汇编语言


在简短的介绍之后,我是否正确地假设有几种C代码编译到的汇编语言?如果是这样的话,它是如何达到所有这些汇编语言的?将其解析为通用汇编语言,然后从那里进行翻译?或者每种不同的汇编语言都有一个单独的过程吗?

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


请注意,如果您正在C代码中编写直接汇编程序(例如,您正在用C编写硬件驱动程序,但需要做一些非常低级的工作),那么您已经将代码锁定到特定平台的汇编语言。C(和编译器)将使用嵌入式x86汇编程序获取一些代码,并将其翻译成(比如)MIPS或PPC。

不需要将C编译成任何特定的程序集或任何程序集,这些都留给编译器的实现者,而不是语言规范的一部分。通常,每个CPU制造商都会开发一个C编译器,以针对其特定的体系结构

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

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

编译器将根据您传递给它的参数来决定在运行时以哪个后端为目标。编译器通常有一个默认后端,该后端在构建编译器时通过配置进行设置(可能默认为构建编译器的体系结构)


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

大多数编译器书籍都处理这个问题。例如,参见第7章。tcc直接进入机器代码,许多都有并通常隐藏了汇编步骤。使编译器的开发和调试更容易。目前使用的主要汇编代码是什么?它们在哪里使用?我能想到的“四大”是英特尔x86(奔腾、core等)、英特尔ia-64(安腾)、powerpc(旧Mac)和arm(大多数移动设备)。对于更集中/更狭窄的市场,还有大量其他更小的体系结构。基本上,如果一个体系结构存在,它可能有一个C编译器。Java字节码可能很接近,或者UCSD Pascal p代码。7年后,我也在进行类似的探索,寻找可以在i686 Intel/AMD和ARM上运行的东西,而RealAssembly将您与特定的CPU联系在一起。我可能会把GNU作为一个研究对象。我猜有些指令是通用的(mov、cmp、add等),或者可以通过宏实现,而其他指令则不是。但正如CPU品牌是一个问题一样,时代也是一个问题。我刚找到一件12岁的东西,我想试试。我使用的最后一个程序集是25年前的8088代码。对中使用的中间表示法的解释有些过时。