所以我发现C(++)程序实际上并没有编译成简单的"二进制"(我可能在这里遇到了一些问题,在这种情况下我很抱歉:D)但是对于一系列事物(符号表) ,os相关的东西,...)但......
汇编程序"编译"到纯二进制文件?这意味着除了预定义的字符串等资源之外没有额外的东
如果C编译成除了普通二进制文件以外的其他内容,那么小型汇编程序引导程序如何只是将指令从HDD复制到内存并执行它们?我的意思是,如果操作系统内核(可能用C语言编写)编译成不同于普通二进制文件的东西 - 引导加载程序如何处理它?
编辑:我知道汇编程序没有"编译",因为它只有你的机器的指令集 - 我没有找到汇编程序"汇编"的好词.如果你有一个,请留在这里作为评论,我会改变它.
来自C++中的思考 - 第1卷:
在第二遍中,代码生成器遍历解析树并为树的节点生成汇编语言代码或机器代码.
至少在GCC中,如果我们给出生成汇编代码的选项,编译器会通过创建包含汇编代码的文件来服从.但是,当我们只是在gcc没有任何选项的情况下运行命令时,它是否在内部不生成汇编代码?
如果是,那么为什么需要首先生成汇编代码然后将其转换为机器语言?
我有困惑.我是C++开发人员,并多次听说我的源代码将首先转换为程序集,然后程序集将转换为机器代码.但是在汇编语言的一个视频教程中,教师清楚地说,C/C++代码直接转换为机器代码.(当然会有链接和加载).
我见过像这样的链接, C++代码是否编译成汇编代码?
我仍然无法澄清我的怀疑.
如果以防万一,C++没有首先转换为汇编,那么反汇编器如何从二进制生成汇编代码.
为了缩小我的问题范围,让我描述一下我的假设和我所做的实验......
我的假设:用汇编语言编写的代码将比 C/C++ 对应的代码运行得快得多,并且可执行文件的大小也比 C/C++ 代码生成的代码小得多。
实验:我将以下程序写入bin2dec.c
#include <stdio.h>
int main()
{
long int binary, decimal, reminder, exp;
int i, j;
for(i=0; i<10000; i++)
{
for(j=0; j<1000; j++)
{
binary = 11000101;
exp = 1;
decimal = 0;
while(binary != 0)
{
reminder = binary % 10;
binary = binary / 10;
decimal = decimal + reminder * exp;
exp *= 2;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后为其生成ASM代码gcc -S bin2dec.c -o bin2dec.s
之后我编译了两个文件,如下所示
gcc bin2dec.c -o bin2dec_c …Run Code Online (Sandbox Code Playgroud)