您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 
 订阅
CPU是怎么计算“1+2”的
 
 
  415  次浏览      19 次
2023-12-6
 
编辑推荐:
本文主要介绍了计算机究竟是如何执行程序进行计算的?CPU在底层又是如何发挥作用的等相关知识。
本文来自于微信公众号芯生代 ,由火龙果软件Linda编辑推荐。

前面撰写了【干货】一文搞懂CPU的工作原理 ,介绍了计算机的冯诺依曼体系结构和中央处理器CPU的主要组成(控制器、运算器、寄存器)。

但是,估计很多人还是不太明白:计算机究竟是如何执行程序进行计算的?CPU在底层又是如何发挥作用的?

为了更好地解释,小编用C语言编写了一段代码,主要是计算“1+2”的结果,用a来表示并将计算结果进行返回。

int main() {
int a = 1 + 2;
return a;
}

 

然而,身处于计算机底层硬件的CPU是不认识"a=1+2"这个字符串的。

因为CPU只能识别0和1二进制的机器码。

虽然这些字符串只是方便我们程序员认识,要想这段程序能跑起来,还需要把整个程序翻译成汇编语言的程序,这个过程称为编译成汇编代码。

通过 GCC 编译器将这段 C语言程序代码编译成二进制文件,输入以下命令让其编译成目标文件:

gcc -O0 -o code_prog code.c

程序编译过程中,编译器通过分析代码,发现 1 和 2 是数据,于是程序运行时,内存会有个专门的区域来存放这些数据,这个区域就是「数据段」。

如下图,数据 1 和 2 的区域位置:

数据 1 被存放到 0x100 位置;

数据 2 被存放到 0x104 位置;

注意,数据和指令是分开区域存放的,存放指令区域的地方称为「正文段」。

编译器会把 a = 1 + 2 翻译成 4 条指令,存放到正文段中。

如图,这 4 条指令被存放到了 0x200 ~ 0x20c 的区域中:

0x200 的内容是 load 指令将 0x100 地址中的数据 1 装入到寄存器 R0;

0x204 的内容是 load 指令将 0x104 地址中的数据 2 装入到寄存器 R1;

0x208 的内容是 add 指令将寄存器 R0 和 R1 的数据相加,并把结果存放到寄存器 R2;

0x20c 的内容是 store 指令将寄存器 R2 中的数据存回数据段中的 0x108 地址中,这个地址也就是变量 a 内存中的地址;

编译完成后,具体执行程序的时候,程序计数器会被设置为 0x200 地址,然后依次执行这 4 条指令。

不难发现:“a=1+2”这样一段程序代码,通过编译被翻译成了4条指令,并且存在内存中。

编译器在编译程序的时候,会构造指令,这个过程叫做指令的编码。

CPU 执行程序的时候,就会解析指令,这个过程叫作指令的解码。

实际上,程序代码均可以编译成一条一条的指令。程序代码的运行过程,就是把每一条指令一步一步的执行起来,而执行指令就需要CPU(中央处理器)了。

因此,CPU执行程序代码的过程,实际上是执行一条条指令,过程如下:

第一步:CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过「数据总线」将指令数据传给 CPU,CPU 收到内存传来的数据后,将这个指令数据存入到「指令寄存器」。

第二步:CPU 分析「指令寄存器」中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给「逻辑运算单元」运算;如果是存储类型的指令,则交由「控制单元」执行;

第三步:CPU 执行完指令后,「程序计数器」的值自增,表示指向下一条指令。这个自增的大小,由 CPU 的位宽决定,比如 32 位的 CPU,指令是 4 个字节,需要 4 个内存地址存放,因此「程序计数器」的值会自增 4;

总结就是:一个程序(一段代码)执行的时候,CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令。

现代大多数 CPU 都使用来流水线的方式来执行指令,详见【干货】一文搞懂CPU流水线的工作原理,所谓的流水线就是把一个任务拆分成多个小任务,于是一条指令通常分为 4 个阶段,称为 4 级流水线,如下图:

四个阶段的具体含义:

CPU 通过程序计数器读取对应内存地址的指令,这个部分称为 Fetch(取得指令);

CPU 对指令进行解码,这个部分称为 Decode(指令译码);

CPU 执行指令,这个部分称为 Execution(执行指令);

CPU 将计算结果存回寄存器或者将寄存器的值存入内存,这个部分称为 Store(数据回写);

上面这 4 个阶段就是一个周期,CPU 的工作就是一个周期接着一个周期,周而复始。

事实上,不同的阶段其实是由计算机中的不同组件完成的:

取指令的阶段,我们的指令是存放在存储器里的,实际上,通过程序计数器和指令寄存器取出指令的过程,是由控制器操作的;

指令的译码过程,也是由控制器进行的;

指令执行的过程,无论是进行算术操作、逻辑操作,还是进行数据传输、条件分支操作,都是由算术逻辑单元操作的,也就是由运算器处理的。但是如果是一个简单的无条件地址跳转,则是直接在控制器里面完成的,不需要用到运算器。

CPU 从程序计数器读取指令、到执行、再到下一条指令,这个过程会不断循环,直到程序执行结束,这个不断循环的过程被称为 CPU 的指令周期。

上面解释了CPU计算“1+2”的程序代表编译和运算流程,相信对大家有所帮助!

但是,还有一个问题,CPU是计算机的重要部件,由单晶硅以一定的生产工艺制造出来的集成电路,其电路又是如何执行“1+2”编译后的二进制机器码的呢?

欲知后事如何,且听下期分解!

   
415 次浏览       19
相关文章

HTTP协议详解
nginx架构模型分析
SD-WAN那些事
5G与边缘计算
 
相关文档

无线技术之物联网概论
IPv6应用和实现技术
物联网应用范围及实例
物联网应用技术
相关课程

无线传感网络技术
物联网与边缘计算
物联网关键技术、安全与边缘计算
物联网技术架构与应用

最新活动计划
MBSE(基于模型的系统工程)4-18[北京]
自然语言处理(NLP) 4-25[北京]
基于 UML 和EA进行分析设计 4-29[北京]
以用户为中心的软件界面设计 5-16[北京]
DoDAF规范、模型与实例 5-23[北京]
信息架构建模(基于UML+EA)5-29[北京]
 
 
最新文章
云原生架构概述
K8S高可用集群架构实现
容器云管理之K8S集群概述
k8s-整体概述和架构
十分钟学会用docker部署微服务
最新课程
云计算、微服务与分布式架构
企业私有云原理与构建
基于Kubernetes的DevOps实践
云平台架构与应用(阿里云)
Docker部署被测系统与自动化框架实践
更多...   
成功案例
北京 云平台与微服务架构设计
通用公司GE Docker原理与实践培训
某军工研究单位 MDA(模型驱动架构)
知名消费金融公司 领域驱动设计
深圳某汽车企业 模型驱动的分析设计
更多...