Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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_Compilation - Fatal编程技术网

Assembly 谁将高级语言转换为汇编语言

Assembly 谁将高级语言转换为汇编语言,assembly,compilation,Assembly,Compilation,通过学习计算机指令/程序的基本功能,我了解到我们用高级语言编写源代码。编译器将其转换为低级语言(机器代码/目标代码)。我还了解到汇编程序将汇编语言转换为机器代码/目标代码。 然后我有以下疑问: 如果编译器直接将高级转换为低级,则生成此汇编语言的位置 如果转换过程必须通过汇编语言,即 高级语言===>汇编语言===>目标代码/机器代码, 那么谁将这种高级语言转换成汇编语言,以及它的用途是什么?这是一个非常普遍的问题(老实说,也有点难以理解) 高级语言的编译器可以将高级代码转换为汇编程序,而辅助实用

通过学习计算机指令/程序的基本功能,我了解到我们用高级语言编写源代码。编译器将其转换为低级语言(机器代码/目标代码)。我还了解到汇编程序将汇编语言转换为机器代码/目标代码。
然后我有以下疑问:

  • 如果编译器直接将高级转换为低级,则生成此汇编语言的位置

  • 如果转换过程必须通过汇编语言,即

  • 高级语言===>汇编语言===>目标代码/机器代码,

    那么谁将这种高级语言转换成汇编语言,以及它的用途是什么?

    这是一个非常普遍的问题(老实说,也有点难以理解)

    高级语言的编译器可以将高级代码转换为汇编程序,而辅助实用程序可以将汇编程序转换为您所称的机器代码。编译器也可以直接生成机器代码。这两个选项都是有效的,由编译器的设计者决定哪一个最合适

    这就是说,汇编程序离“机器代码”只有一步之遥,因此能够读取汇编程序以确定编译器所做的工作通常很有用。有时,这将导致洞察,使一个优化的高级代码;其他时候,1337程序员可能会选择手工编辑程序集。因此,即使编译器似乎直接生成机器代码,通常情况下也可以生成汇编代码


    有关更多详细信息,请参阅。

    这只是一个术语和具体实现不精确的问题

    在“经典”模型中,编译器将高级代码转换为汇编,汇编程序将其组装为机器代码,机器代码存储到目标文件中,然后链接到目标文件以生成可执行文件

    通常,所有这些步骤都是隐藏的(尤其是汇编部分),因为通常通过“编译器驱动程序”调用编译器,该驱动程序会自动调用此工具链的所有部分,尽管通常有一些选项可以在某个级别停止流,以检查正在发生的事情(停在程序集级别检查编译器的工作非常有趣,甚至有可能)


    不过,这是一个相当高的层次视图,根据语言和实现的不同,某些步骤可能会丢失或以不同的方式处理-例如,您可以让编译器直接生成机器代码,或者让链接器生成汇编/机器代码,而不只是链接(启用链接时代码生成时,始终会发生这种情况)所以,上面的模式只是一个理解基本流程的有用模式,它并不是穷尽所有可能。只要高级语言进入,某种可执行代码退出,任何事情都会发生。

    实际上,编译器从未将高级语言转换成机器级语言。这个定义是正确,但仅适用于C语言。 因为在java file.java中,编译器会将java转换成字节码,而编译器不是高级或低级语言,而是中间语言。
    编译器是一种程序,因为它将源代码或语言转换为目标代码或语言,其中源代码可以是高级语言,但目标代码应低于源代码,因为如果两者的级别相同,则称为预处理器。

    通常没有人。高级编译器不会将源代码转换为汇编语言汇编语言是为程序员设计的一种可读的对象/机器代码版本。(然而,正如其他答案所建议的那样,几乎总是可以要求编译器提供一种高级语言,以向您提供它生成的对象/机器代码的汇编代码列表,而这正是混淆开始的地方)@CodyGray:gcc使用非常广泛,它确实将asm作为编译器的文本输出编写,并在其上运行汇编程序,作为运行单独可执行文件的单独进程。(tmp文件或管道).binutils甚至是一个独立于gcc本身的包。因此,某些编译器肯定会以这种方式编译。Clang不会,其他可移植性较差的编译器也通常直接使用机器代码。您可以将汇编语言视为表示机器语言的一种方式。编译器不需要在汇编语言前停下来uage station,
    gcc-S-fverbose asm
    实际上会在asm中添加注释,因此它比简单地分解机器代码输出更有意义。ICC(英特尔编译器)会对分支上的分支执行概率进行百分比估计。clang的
    -fverbose asm
    包括显示SIMD向量洗牌功能的注释(例如,
    xmm0=xmm1[3,2,3,2]
    )@Richard:谢谢,我明白你的意思,这取决于实现。可能有两种情况:1.编译器将HLL转换为汇编语言,然后汇编程序将汇编语言转换为LL语言(机器代码/目标代码)2.Comipler直接将HLL转换为LLL(机器代码/目标代码)…如果您能帮助我解决这两个概念,我将不胜感激:目标代码或机器代码。它们是何时生成的?(在哪种情况下)?@laura:这个网站的形式是,只要可能,一次只问一个问题。如果这个问题的答案在这里还没有,你应该把它作为一个新问题来问。我相信在你的第二段中,你用了两次汇编而不是汇编。对吗?汇编=语言,汇编=“程序”将程序集转换为机器代码的。