我有困惑。我是C ++开发人员,并多次听说我的源代码将首先转换为程序集,然后程序集将转换为机器代码。 但是在汇编语言的一个视频教程中,教师清楚地说,C / C ++代码直接转换为机器代码。 (当然会有链接和加载)。
我看过这样的链接, Does the C++ code compile to assembly codes?
我仍然无法澄清我的怀疑。
如果以防万一,C ++没有首先转换为汇编,那么解组器如何从二进制生成汇编代码。
答案 0 :(得分:7)
在旧的(非常古老的)时代,编译器的工作方式如下:
现在,除非您真的需要汇编输出,否则编译器不会生成显式汇编语言代码。它只会在内存中生成一些程序集,然后将其自身转换为机器代码,并仅将机器代码写入文件。 这就是您的教师在说C / C ++直接转换为机器代码时的意思。
还有一件事你应该知道。机器代码与汇编语言基本相同。在汇编语言中,指令具有名称并使用字符串编写,但这些是在机器代码中使用的相同的指令(一对一映射)。这很重要,所以我重复一遍:机器代码和汇编是一样的,只用不同的符号写成。
这就是为什么任何二进制文件都可以被拆解的原因;因为要将某些东西从机器代码转换为汇编,你只需要更改表示(将每个指令及其操作数从二进制转换为“助记符”形式。
因此,出于性能原因,现代编译器实际上可能不会生成表示指令的实际字符串(例如mov rax, 42
)。如果没有人想要组装输出,为什么要浪费内存和处理能力呢?但是他们当然会生成等效的机器代码,这对编译器生成来说更快。
答案 1 :(得分:0)
由于机器代码直接映射到装配,因此分析差异并不是很实用。正如C ++语言所代表的那样,它只描述了行为,并且直到实现它的作用。可以发出CLI代码或java字节码或其他任何内容。
在实践中,大多数实现都会一直进行,并在最后发出汇编/机器级优化代码。并支持汇编源文件(.asm,.s)或带注释的代码/ assy / C ++源代码的发布。