“在一天结束前,我需要将我的C代码转换为一种特定于我的CPU的语言。那么,谁在乎知道我的CPU特定的指令?操作系统吗?
CPU。
但请注意,在现代计算机上,表面上单个的CPU只是一种错觉。
不过,对于简单的C编程来说,这已经是一个足够好的概念模型了。
如果你要求的话,gcc会将任何C语言转换为汇编语言。选项
-S
将生成一个汇编清单。对于PC,您可以选择AT&T语法或普通的Intel语法。不幸的是,AT&T(通过
-masm=att
确定)是默认的,但您可以使用
-masm=intel
来获取普通的汇编语言。
如果你没有要求生成汇编代码,那么gcc可能会直接从其内部抽象语法树(AST)生成目标代码。
将汇编语言作为中间形式产生只会增加复杂性和低效率,所以我非常怀疑它是否这样做。
我知道(实际上是猜测)对于每种处理器类型,我都需要一个汇编器来解释汇编代码并将其转换为特定于我的CPU的指令。这个汇编器在哪里(由谁提供)?它随操作系统一起提供吗?
你不需要这样的汇编器。但是gcc带有一个汇编器
as
。类Unix操作系统通常捆绑了
gcc
和
as
,而Windows没有捆绑开发工具。然而,微软的开发工具现在可以免费下载,包括完整的Visual Studio IDE。微软的汇编器是
ml.exe
,被称为MASM,宏汇编器(好像没有其他宏汇编器一样)。
“为什么我用文本编辑器打开二进制文件看不到0和1?”这取决于文本编辑器。虽然我不知道有哪个文本编辑器可以显示0和1,但文本编辑器是设计用来将字节解释为文本的。如果您需要这样的文本编辑器,您可以自己编写。但请注意:我无法想出任何实际用途。
关于标题中的问题,主要步骤如下:
实际上有两个主要步骤:编译和链接。编译步骤进一步细分为预处理和核心语言编译,即
编译 → 链接
实际上是
(预处理 → 核心语言编译)→ 链接
在预处理期间,源代码文件通过#include指令组合在一起。这会生成一个完整的源代码“翻译单元”。核心语言编译将其转换为包含某些未解决引用的机器码的目标代码文件。
最后,链接步骤将目标代码文件(包括库中的目标代码文件内容)组合成一个完整的可执行文件。
vim -b a.out
然后输入:%!xxd
。这将显示二进制文件的十六进制值。你也可以通过objdump -s a.out
查看二进制文件的十六进制值。 - Z boson