C++ 将C++;首先转换为程序集

C++ 将C++;首先转换为程序集,c++,assembly,compiler-construction,standards,C++,Assembly,Compiler Construction,Standards,我感到困惑。我是C++开发人员,多次听到我的源代码将首先转换为程序集,然后程序集将被转换成机器代码。 但在汇编语言的一个视频教程中,讲师明确表示,C/C++代码直接转换为机器代码。(当然会有链接和加载) 我见过这样的链接, 我仍然无法澄清我的疑问 如果在C++中没有首先转换成程序集,那么汇编程序是如何从二进制生成汇编代码的。p> 由于机器代码相当直接地映射到程序集,因此分析差异并不十分实际。正如C++语言所代表的,它只描述行为,以及实现它所做的事情。也可以发出CLI代码或java字节码或其他任

我感到困惑。我是C++开发人员,多次听到我的源代码将首先转换为程序集,然后程序集将被转换成机器代码。 但在汇编语言的一个视频教程中,讲师明确表示,C/C++代码直接转换为机器代码。(当然会有链接和加载)

我见过这样的链接,

我仍然无法澄清我的疑问


<>如果在C++中没有首先转换成程序集,那么汇编程序是如何从二进制生成汇编代码的。p> 由于机器代码相当直接地映射到程序集,因此分析差异并不十分实际。正如C++语言所代表的,它只描述行为,以及实现它所做的事情。也可以发出CLI代码或java字节码或其他任何代码

在实践中,大多数实现实际上一直在进行,并在最后发出程序集/机器级别的优化代码。并支持程序集源文件(.asm、.s)或带注释的代码/assy/C++源文件的发布。

在过去(非常旧)的日子里,编译器的工作方式如下:

  • 编译器在文件中生成汇编代码并将其写入磁盘
  • 汇编程序获取该文件并生成二进制文件
  • 现在,除非您确实需要汇编输出,否则编译器不会生成显式汇编语言代码。它只会在内存中生成一些程序集,然后将其自身转换为机器代码,并且只将机器代码写入文件。这就是你的指导老师说C/C++直接转换成机器代码的意思

    还有一件事你应该知道。机器代码和汇编语言基本上是一样的。在汇编语言中,指令具有名称并使用字符串编写,但这些指令(一对一映射)与机器代码中使用的指令相同。这一点很重要,所以我重复一遍:机器代码和程序集是相同的,只是用不同的符号编写

    这就是为什么任何二进制文件都可以被反汇编;因为要将机器代码转换为汇编代码,只需更改表示(将每条指令及其操作数从二进制转换为“助记符”形式)


    因此,现代编译器实际上可能不会生成表示指令的实际字符串(例如,
    mov-rax,42
    )出于性能原因。如果没有人想要程序集输出,为什么要浪费内存和处理能力来生成它呢?当然,它们会生成等价的机器代码,这对于编译器来说生成速度更快。

    “反汇编程序如何从二进制文件生成程序集代码。”无论可执行文件是如何生成的,都可以执行此操作。给定机器代码序列和指令集引用,可以生成反汇编。默认情况下,现代编译器不再生成汇编中间代码。反汇编程序只需获取二进制文件并将代码部分转换回人类可读的汇编表示形式.Assembly只是表示机器指令的可读形式。请阅读您提供的链接。答案就在那里:它主要取决于您的编译器。最后一个问题没有意义。这就像提问一样“如果文本不是由荷兰语翻译成英语,那么你怎么能把它从英语翻译成荷兰语呢?”。它来自哪里并不重要。