计算机系统漫游
术语解释
位:数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。
字节:字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于有八位, [1] 也表示一些计算机编程语言中的数据类型和语言字符。
机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。
一个程序的执行过程
以一个简单的hello.c 的程序来简单说明:
#include
int main()
{
print("hello,world\n");
return 0;
}
存储
字节表示程序中的某些文本字符,大部分计算机系统用ASCII标准来表示这些文本,hello.c的程序是以字节序列的方式存储在文件中的,每个字节都有一个整数值(ASCII码)。
为了能在系统上执行hello.c程序,每条c语言都必须被其他程序转化为一系列低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件存储起来,目标文件也称为可执行文件。
编译
编译系统包括:预处理器,编译器,汇编器,链接器
image.png
1. 预处理阶段
预处理器(cpp)根据以字符#号开头的命令,修改原始的c程序。比如hello.c中的第一行#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到程序文本中,结果得到了另一个C程序,通常是以.i为扩展名。在Linux下我们用GCC命令:
gcc -E hello.c -o hello.i
得到一个hello.i文件,然后查看文件内容发现,该程序依然是C语言程序,只不过多了头文件stdio.h的内容。
2. 编译阶段
编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言中每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。其实汇编语言是非常有用的,它为所有的高级语言提供了一种通用的输出语言。比如C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。在Linux下,我们用命令:
gcc -S hello.i -o hello.s</pre>
得到一个hello.s汇编程序,内容如下:
.file "hello.c"
.section .rodata
.LC0:
.string "hello world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-11)"
.section .note.GNU-stack,"",@progbits
hello.s
3. 汇编阶段
汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可定位目标程序的格式,并将结果保存在目标文件hello.o中,hello.o是一个二进制文件,它的字节编码是“机器语言指令”而不是“字符”,所以,我们用文本编辑器打开hello.o文件看到是会是一堆乱码。使用gcc命令:
gcc -c hello.s -o hello.o
将得到hello.o文件,用vim打开是乱码
4. 链接阶段
我们注意到,hello.c中有一个printf函数,它是每个C编译器都会提供的标准库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。链接器(ld)就是负责处理这种合并。最后得到hello文件,一个可执行目标文件(可执行文件),可被加载到内存中,由系统执行。使用命令:
gcc hello.o -o hello</pre>
得到hello文件,可执行文件
自此,编译系统的整个过程大致如此。总结一下,从源程序到目标文件(可执行文件)的转化是通过编译系统完成的,编译系统包含四个阶段:预处理,编译,汇编,链接。一般的编译驱动程序如GCC都实现了编译系统的所有功能,我们用编译驱动程序直接就可以实现源程序到目标文件的转化。
那么在程序执行过程时,具体的情况又是怎样的呢
参考
百度百科--位:https://baike.baidu.com/item/%E4%BD%8D/7202673
百度百科--机器语言:https://baike.baidu.com/item/%E6%9C%BA%E5%99%A8%E8%AF%AD%E8%A8%80/2019225?fr=aladdin
文本文件和二进制文件的区别:https://www.cnblogs.com/macliu/p/6340131.html
网友评论