use*_*987 1 c++ compiler-construction assembly standards
我有困惑.我是C++开发人员,并多次听说我的源代码将首先转换为程序集,然后程序集将转换为机器代码.但是在汇编语言的一个视频教程中,教师清楚地说,C/C++代码直接转换为机器代码.(当然会有链接和加载).
我见过像这样的链接, C++代码是否编译成汇编代码?
我仍然无法澄清我的怀疑.
如果以防万一,C++没有首先转换为汇编,那么反汇编器如何从二进制生成汇编代码.
在旧的(非常古老的)时代,编译器的工作方式如下:
目前,除非您真的需要汇编输出,否则编译器不会生成显式汇编语言代码.它只会在内存中生成一些程序集,然后将其自身转换为机器代码,并仅将机器代码写入文件.这就是您的教师在说C/C++直接转换为机器代码时的意思.
还有一件事你应该知道.机器代码与汇编语言基本相同.在汇编语言中,指令具有名称并使用字符串编写,但这些是在机器代码中使用的相同指令(一对一映射).这很重要,所以我重复一遍:机器代码和汇编是一样的,只用不同的符号书写.
这就是为什么任何二进制文件都可以被拆解的原因; 因为要将某些东西从机器代码转换为汇编,您只需要更改表示(将每个指令及其操作数从二进制转换为"助记符"形式).
因此,mov rax, 42出于性能原因,现代编译器实际上可能不会生成表示指令的实际字符串(例如).如果没有人想要组装输出,为什么要浪费内存和处理能力呢?但是他们当然会生成等效的机器代码,这对编译器生成来说更快.
| 归档时间: |
|
| 查看次数: |
2028 次 |
| 最近记录: |