将C ++首先转换为汇编

时间:2013-06-19 16:09:27

标签: c++ assembly compiler-construction standards

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

我看过这样的链接, Does the C++ code compile to assembly codes?

我仍然无法澄清我的怀疑。

如果以防万一,C ++没有首先转换为汇编,那么解组器如何从二进制生成汇编代码。

2 个答案:

答案 0 :(得分:7)

在旧的(非常古老的)时代,编译器的工作方式如下:

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

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

    这就是为什么任何二进制文件都可以被拆解的原因;因为要将某些东西从机器代码转换为汇编,你只需要更改表示(将每个指令及其操作数从二进制转换为“助记符”形式。

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

答案 1 :(得分:0)

由于机器代码直接映射到装配,因此分析差异并不是很实用。正如C ++语言所代表的那样,它只描述了行为,并且直到实现它的作用。可以发出CLI代码或java字节码或其他任何内容。

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