2

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

我看过这样 的链接,C++ 代码是否编译为汇编代码?

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

如果万一,C++ 没有首先转换为汇编,反汇编器如何从二进制生成汇编代码。

4

2 回答 2

12

在过去(非常古老)的日子里,编译器是这样工作的:

  1. 编译器在文件中生成汇编代码并将其写入磁盘,
  2. 汇编器获取该文件并生成二进制文件。

如今,除非您真的想要汇编输出,否则您的编译器不会生成显式的汇编语言代码。它只会在内存中生成一些程序集,然后自己将其转换为机器代码,并且只将机器代码写入文件。这就是您的讲师说 C/C++ 直接转换为机器代码时的意思

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

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

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

于 2013-06-19T16:28:19.643 回答
0

由于机器代码非常直接地映射到汇编,因此分析差异不是很实用。就 C++ 语言而言,它仅描述行为,并由实现决定它的作用。也可以发出 CLI 代码或 java 字节码或其他任何东西。

在实践中,大多数实现确实一路走来,并在最后发出汇编/机器级优化代码。并支持汇编源文件(.asm、.s)或带注释的代码/assy/C++源的发射。

于 2013-06-19T16:27:52.267 回答