一些边角料的前置小知识
1 一段程序是如何运行的
计算机硬件是无法直接运行高级语言编写的文本代码的。以C语言为例,需要C语言编译器把高级语言编写的代码编译成具体硬件平台的二进制代码。再由具体的操作系统建立进程,把这个二进制文件装进其进程的内存空间,才能运行。
编译
代码文件------>二进制代码-->装载到其进程的内存-->运行
1.1 程序编译过程
| gcc编译工具链 | 编译命令 | 生成文件 | 做了什么 |
|---|---|---|---|
| gcc预处理器 | gcc xxx.c -E -o xxx.i | xxx.i | 预处理:假如头文件替换宏 |
| gcc编译器 | gcc xxx.c -S -o xxx.s | xxx.s | 编译:包含预处理,将C代码程序转换为汇编代码程序 |
| gcc汇编器 | gcc xxx.c -c -o xxx.o | xxx.o | 包含预处理和汇编,将汇编代码程序转换为可连接的二进制程序 |
| gcc链接器 | gcc xxx.c -c -o xxx | xxx | 包含以上所有操作,将可链接的二进制程序和其他别的库链接在一起,形成可执行的成语文件 |
1.2二进制程序的装载
1.2.1 二进制程序中有什么
二进制程序 = 汇编代码+二进制数据
| 命令 | 功能 |
|---|---|
| gcc -c -S xxx | 只获得汇编代码而不能得到二进制数据 |
| objdump -d xxx | 反汇编,获得汇编代码和二进制数据 |
1.2.2反汇编文件内容的格式
| 地址 | 十六进制数 | 汇编代码 | 代码注释 |
|---|---|---|---|
| 二进制程序每条指令装载的内存地址 | 真正装入机器中的代码数据 | 对应的汇编代码 | 相关代码的注释 |
1.2.3 图灵机和冯诺伊曼体系结构
图灵机模型是理想情况下的,如何实现呢?冯诺伊曼体系结构搞定!
1.2.3.1 什么是图灵机
图灵机是一个抽象模型。假设有一个无限长的带有读头的纸带,纸带上带有无限个小格子,小格子中写有相关的信息,读头能根据纸带小格子里的信息做相关的操作并能左右移动。
例如,图灵机执行1+1=2”的计算,我们定义读头读到“+”之后,就依次移动读头两次并读取格子中的数据,最后读头计算把结果写入第二个数据的下一个格子里,整个过程如下图:




1.2.3.2 冯诺依曼体系结构——实现图灵机
思考图灵机应该具备的功能:
- 要能装载程序和数据
- 能记录程序、中间结果和最终结果
- 可以运算
- 可以控制读头
- 能按照要求现实结果
为了实现这些功能需要以下组成部件:
- 装载数据和程序的输入设备
- 记住程序和数据的存储器
- 完成数据加工处理的运算器
- 控制程序执行的控制器
- 显示处理结果的输出设备
| 功能 | 组成部件 |
|---|---|
| 把程序和数据装入到计算机中 | 装载数据和程序的输入设备 |
| 必须具有长期记住程序、数据的中间结果及最终运算结果 | 记住程序和数据的存储器 |
| 完成各种算术、逻辑运算和数据传送等数据加工处理 | 完成数据加工处理的运算器 |
| 根据需要控制程序走向,并能根据指令控制机器的各部件协调操作 | 控制程序执行的控制器 |
| 能够按照要求将处理的数据结果显示给用户 | 显示处理结果的输出设备 |

被折叠的 条评论
为什么被折叠?



