C程序的执行
我们对于C程序,有这么一套代码:
#include <stdio.h>
int main(){
printf("hello worldn");
return 0;
}
我们知道,对于一个高级C语言程序来说,要在在机器上运行它需要将每条C语句转化成一系列第几的机器语言指令,然后将这些指令打包成为有固定格式的可执行目标程序,才能运行。而这个可执行目标程序一般以二进制磁盘文件的形式存放在硬盘中。所以可执行目标程序也叫可执行目标文件。
转化的方法是对这个C语言程序文件进行编译。这个操作由编译器驱动程序完成。
转化的方法是对这个C语言程序文件进行编译。这个操作由编译器驱动程序完成。
$ gcc -o hello hello.c
整个编译系统的过程如下:
![8e4f4b1e37e0d8d09e74e3899382bda1.png](https://i-blog.csdnimg.cn/blog_migrate/1fa274c3f54bfa7c833fbb2f5035d6af.jpeg)
而运行该程序需要我们在shell中执行:
$ ./hello
# 以下是输出
hello, world
而机器实际的工作如下图:
![77bdba9482f64c408ff743dfc42b7175.png](https://i-blog.csdnimg.cn/blog_migrate/b3d7860f0f03ea039d2a001e4f2df5f9.jpeg)
1. 我们通过键盘输入命令./hello
,shell程序将字符逐一读入寄存器,再把它放入内存中(主存储器)
2. 我们输入回车好,shell程序察觉到命令的结束,shell执行指令,从磁盘中加载可执行的hello
文件,并将目标文件的代码与数据(“hello, worldn”)复制到主存中。
3. 目标文件加载到主存后,处理器开始执行hello
文件的机器语言指令,这些指令将“hello, worldn”从主存复制到寄存器,再从寄存器复制到显示设备,即屏幕上。
机器指令与系统架构
- 什么是计算机指令集?指令集架构?
计算机体系结构中,计算机指令集(ISA)位于操作系统和硬件之间。计算机指令集是计算机硬件所能执行的操作&命令的直接体现,是计算机硬件可以理解、可以直接运行的命令。我们通过运行特定指令,驱使计算机进行工作。
在学习CSAPP时,我们会发现,CSAPP的第二版针对的是IA32的系统,而第三版则全面支持了x86-64。这里的IA32与x86-64指的就是不同的指令集架构,不同的指令集,对应了不同的计算机指令。
- 什么是处理器架构?
处理器架构简单的说就是硬件的架构,描述了一众计算机硬件如何组织才可以进行运算。而计算机指令集决定了处理器的架构。为了实现指令集才采取的硬件电路所采取的架构就是处理器架构。
- 什么是汇编语言?
在C语言编译的时候,我们会发现在中间步骤,可以看到汇编代码。汇编语言其实是计算机指令集的可视化写法,是助记符,和指令集基本上可以一一对应起来。所以我们可以看到,汇编是有不同的版本的,比如x86的汇编用于微机,单片机的汇编是8051版本,ARM的汇编有v4版本的。
换句话说,不同的计算机指令集有不同的汇编语言。
要设计处理器,首先就需要有指令集,规定处理器相应操作,通过指令集去控制处理器实现相应功能。但处理器是一堆硬件电路,只能识别二进制数据,所以指令集是由一堆二进制数据组成。而二进制数据对人类来说读起来很麻烦。为了方便人类操作指令集,发明了汇编语言来描述指令集。汇编语言类似人类语言,读起来方便多了。处理器架构、指令集和汇编语言,三者有何关系?www.zhihu.com
在计算机体系结构中,计算机指令的位置位于操作系统与硬件之间。ISA为操作系统提供了操作硬件的能力。
![609994d55b3aeb5a2878c54a4744d9cd.png](https://i-blog.csdnimg.cn/blog_migrate/fee338cbd428d1e5d10133ed4ebb207f.jpeg)
计算机是如何工作的
我们可以将计算机的工作类比为做菜
- 做菜前:原材料(数据)和菜谱(指令)都按序放在厨房(CPU)外的菜架(存储器)上,架子的每一层,都有编号(存储单元地址)。
- 菜谱:菜谱定义了原料(数据)的位置(存储单元地址)、做法(指令操作含义)、做好的菜放哪里(目的操作数地址)
- 其中数据可以是立即数(可以理解为一个字面量的数)、寄存器编号、存储地址
- 目的操作数地址可以是寄存器编号、存储地址
e.g. 把10号11号的原料一起炒,并装入10号盘(
add #10 #11
)
- 开始动作:我们可以告诉厨房,从第五个架上(起始PC=5)的菜谱开始做
- 做菜:
- 从5号架上取菜谱(根据PC取指令)
- 看菜谱(指令译码)
- 从架上或盘中取原材料(取操作数)
- 洗、切、炒等具体操作(指令执行)
- 装盘或直接送桌(回写结果)
- 算出下一个菜谱所在的架子号6=5+1(修改PC的值)
- 按照1做下一道菜(执行下一条命令)
知乎的编辑器真的难用。。。为什么不支持全部的markdown呢。。