Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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 编译器是如何;“知道”;如何将代码转换为特定于处理器的程序集?_Assembly_Compiler Construction_Processor_Cpu Architecture - Fatal编程技术网

Assembly 编译器是如何;“知道”;如何将代码转换为特定于处理器的程序集?

Assembly 编译器是如何;“知道”;如何将代码转换为特定于处理器的程序集?,assembly,compiler-construction,processor,cpu-architecture,Assembly,Compiler Construction,Processor,Cpu Architecture,回答者已经知道的东西,但无论如何,这里是我的思考过程: 从HLL到机器代码,这里是发生的事件的大致集合(有链接器和其他东西,但我们暂时忽略它们): HLL-->编译器-->汇编程序---->机器代码 根据我购买的硬件,它可能有不同的处理器(英特尔、SPARC、ARM等)。汇编语言是特定于处理器的。因此,当代码来自编译器-->汇编程序时,生成的汇编代码是特定于处理器的 切中要害: 例如:我的硬件上有Windows操作系统。比如说,我得到了“Windows7 64位C编译器”。我在同一个硬件上也有U

回答者已经知道的东西,但无论如何,这里是我的思考过程:

从HLL到机器代码,这里是发生的事件的大致集合(有链接器和其他东西,但我们暂时忽略它们):

HLL-->编译器-->汇编程序---->机器代码

根据我购买的硬件,它可能有不同的处理器(英特尔、SPARC、ARM等)。汇编语言是特定于处理器的。因此,当代码来自编译器-->汇编程序时,生成的汇编代码是特定于处理器的

切中要害:

例如:我的硬件上有Windows操作系统。比如说,我得到了“Windows7 64位C编译器”。我在同一个硬件上也有Ubuntu,我得到了“Ubuntu 64位C编译器”

  • 我可以在具有不同处理器架构的不同硬件上使用相同的OSs,或者在相同硬件上使用不同的OSs(如上面的示例)。当我下载C编译器时,为什么编译器被列为特定于操作系统的?而不是特定于处理器?因为编译器的全部要点是将HLL转换为汇编,汇编是特定于处理器体系结构的,而不是特定于操作系统的

  • 假设1。是如何完成的,当我下载一个针对Windows7和Ubuntu的编译器时,编译器如何知道要生成哪些特定于处理器的汇编代码?编译器是否附带各种特定于处理器的汇编程序


  • 有几个因素在起作用。对于台式机,实际上只有两种体系结构在使用:32位是x86(具有各种扩展),64位是x86-64。所以很多软件可以忽略这个问题,只指定“比特数”。这对于Windows RT/8之前的Windows尤其如此,Windows RT/8甚至不支持任何其他体系结构

    虽然编译器必须了解处理器体系结构,但实际上所有感兴趣的程序都必须以某种方式与操作系统交互。即使您的代码没有与操作系统交互,编译器也必须知道二进制文件使用哪种文件格式,链接到哪种库,等等。运行时库也是特定于操作系统的,通常与编译器捆绑在一起

    至于编译器如何知道要生成什么样的指令:要么你下载的二进制文件是专门为一种体系结构定制的(不管你从中获得它的页面是否提到过),而不能为其他体系结构生成代码,要么它确实有几个后端在其中编译


    也就是说,我没有看到很多编译器声明“
    编译器for
    ”。编译器编写器在指定指令集方面通常要学究得多,分发服务器也是如此。只有windows的人对此非常草率,因为直到大约一年前,这还不是有用的信息。

    对于实际计算,如添加两个数字,只有硬件重要,在windows和Linux下,您确实可以得到相同的机码

    有趣的“胶水”是由平台库提供的,例如标准C库,它提供了“在标准输出上打印字符”的功能。函数调用代码也完全由硬件决定(尽管Windows和Linux之间有一些不同的约定,例如函数参数的放置位置,但这些只是约定)。这些库的实现提供了有趣的特定于平台的“肉”。例如,
    printf
    是如何实现的?Linux和Windows上生成的代码不同,但差异不在于指令的种类,而在于与操作系统的对话方式


    同样,这主要是一个惯例问题,同一硬件上不同操作系统的程序的实际机器代码没有很大的差异。区别仅仅在于如何让操作系统代表您执行某些事情,比如输入/输出、给您内存、告诉您时间等。

    简而言之,操作系统提供了低级软件服务、驱动程序等,编译器可以利用这些服务。因此编译器是特定于操作系统的。编译器知道要生成什么代码,因为它只是用内置的知识设计的。例如,x86体系结构的编译器具有x86指令集的编译器编写者内置的隐式知识。我没有提到,当您进入最终链接和可执行文件的格式时,显然可执行文件的格式是特定于操作系统的。操作系统解释二进制可执行文件,确定文件中的关键信息,并决定在何处以及如何加载和执行程序。