C ++会首先转换为程序集吗?
Posted
技术标签:
【中文标题】C ++会首先转换为程序集吗?【英文标题】:Will C++ first gets converted to assembly [duplicate] 【发布时间】:2013-06-19 16:09:26 【问题描述】:我很困惑。我是 C++ 开发人员,多次听说我的源代码将首先转换为汇编,然后汇编将转换为机器代码。 但是在汇编语言的视频教程中,讲师明确表示,C / C ++代码直接转换为机器代码。 (当然那里会有链接和加载)。
我见过这样的链接, Does the C++ code compile to assembly codes?
我仍然无法澄清我的疑问。
如果 C++ 没有首先转换为汇编,反汇编器如何从二进制生成汇编代码。
【问题讨论】:
“反汇编程序如何从二进制文件生成汇编代码。” 无论可执行文件是如何生成的,都可以这样做。给定机器代码序列和指令集引用,您可以生成反汇编。 现代编译器默认不再生成汇编中间代码。反汇编程序只需获取二进制文件并将代码部分转换回人类可读的汇编表示。汇编只是表示机器指令的一种可读形式。 请阅读您提供的链接。答案就在那里:它主要取决于你的编译器 最后一个问题没有意义。这就像在问“如果文本不是通过将某些东西从荷兰语翻译成英语,那么你如何将它从英语翻译成荷兰语?”。它来自哪里并不重要。 【参考方案1】:在过去(非常古老)的日子里,编译器是这样工作的:
-
编译器在文件中生成汇编代码并将其写入磁盘,
汇编器获取该文件并生成二进制文件。
如今,除非您真的想要汇编输出,否则您的编译器不会生成显式的汇编语言代码。它只会在内存中生成一些程序集,然后自己将其转换为机器代码,并且只将机器代码写入文件。 这就是你的讲师说 C/C++ 直接转换为机器代码时的意思。
还有一件重要的事情你应该知道。机器码与汇编语言基本相同。在汇编语言中,指令具有名称并使用字符串编写,但这些是在机器代码中使用的相同指令(一对一映射)。这很重要,所以我重复一遍:机器码和汇编是相同的,只是用不同的符号编写。
这就是为什么任何二进制文件都可以被反汇编的原因;因为要将某些东西从机器代码转换为汇编,您只需更改表示形式(将每条指令及其操作数从二进制转换为“助记符”形式。
因此,出于性能原因,现代编译器实际上可能不会生成表示指令的实际字符串(例如mov rax, 42
)。如果没有人想要汇编输出,为什么要浪费内存和处理能力来生成它?但当然,它们确实会生成等效的机器代码,这对于编译器来说生成得更快。
【讨论】:
【参考方案2】:由于机器代码直接映射到汇编,因此分析差异不是很实用。就 C++ 语言而言,它仅描述行为,并由实现决定它的作用。也可以发出 CLI 代码或 java 字节码或其他任何东西。
在实践中,大多数实现确实一路走来,最后发出汇编/机器级优化代码。并支持汇编源文件(.asm、.s)或带注释的代码/assy/C++源的发射。
【讨论】:
以上是关于C ++会首先转换为程序集吗?的主要内容,如果未能解决你的问题,请参考以下文章
为 Excel VSTO 插件构建程序集 COM-Visible 中断