03. 程序在内存中被CPU执行

news2024/10/7 20:33:48

1. 程序是什么?

程序是由指令数据组成的。

当我们使用计算机运行一个程序时,计算机会读取程序中的指令一步步执行,直到达到程序结束的地方。

  1. 程序的指令:就像一份菜谱,告诉计算机按照哪些步骤来做事情。

  2. 程序的数据:就像菜谱中需要的材料一样,程序需要一些数据才能够按照预期的方式运行。

2. CPU中的寄存器

上一章中说了CPU的组成部分:

CPU的内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。寄存器可用来暂存指令、数据等处理对象,可以将其看作是内存的一种。根据种类的不同,一个CPU内部会有20~100个寄存器。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号。

CPU是具有各种功能的寄存器的集合体,对于程序员来说只需要了解寄存器就可以了!因为程序指令是通过寄存器来描述的

  • 程序实现的是将100和200两个数值相加,并将结果输出到显示器上。

寄存器的种类有很多,这里列举对程序员理解程序来说最重要的几种。

种类功能
程序计数器存储下一条指令所在内存的地址
累加寄存器存储执行运算的数据和运算后的数据
标志寄存器存储运算处理后的CPU的状态
通用寄存器存储任意数据

3. 程序的流程

程序的流程分为三种,顺序执行,条件分支、循环。

决定程序流程的是程序计数器

3.1 顺序执行

假设程序加载到内存后存放的位置是从0100~0106, CPU执行0100地址的指令后,程序计数器的值就变成了0101((当执行的指令占据多个内存地址时,增加与指令长度相应的数值),然后,CPU的控制器就会参照程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程。

  • 示例中的程序实现的是将100和200两个数值相加,并将结果输出到显示器上。

实际上每一条指令可能存储在多个地址上,类似如下:

3.2 条件分支

程序运行的开始位置是0100地址。随着程序计数器数值的增加,当到达0102地址时,如果累加寄存器的值是正数,则执行跳转指令(jump指令)跳转到0104地址。此时,由于累加寄存器的值是100,为正数,因此0103地址的指令被跳过,程序的流程直接跳转到了0104地址。也就是说,“跳转到0104地址”这个指令间接执行了“将程序计数器设定成0104地址”这个操作。

  • 这里程序计数器的数值 从 0102 直接变化为 0104。

3.3 循环执行

程序执行到0102地址时,如果累加寄存器的值小于0,跳转到0105地址。如果累加寄存器的值大于0,执行0103 0104的地址的指令,注意0104的地址的指令是又跳转到0102地址。所以就产生循环了!

  • 刚开始累加寄存器的值是2,一次循环减1,第二次循环结束后,变成0。
  • 程序计数器数值 0102→0103→0104 变化了两次。

条件分支和循环中使用的跳转指令,会参照当前执行的运算结果来判断是否跳转。

CPU在进行运算时,标志寄存器的数值会根据运算结果自动设定。条件分支在跳转指令前会进行比较运算。至于是否执行跳转指令,则由CPU在参考标志寄存器的数值后进行判断。运算结果的正、零、负三种状态由标志寄存器的三个位表示。

3.4 函数的调用机制

函数的调用也是通过把程序计数器的值设定成函数的存储地址来实现的。

和条件分支、循环不同的是:函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。

  • 通过跳转指令把程序计数器的值设定成1001实现对add函数的调用。
  • 函数执行完成后再通过跳转指令把程序计数器的值设定为0103,继续原函数的流程。

4. 总结

程序是由指令和数据组成的,程序是在内存中被CPU执行的。程序执行的流程是通过程序计数器来完成的。

关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!

文章和代码仓库:

gitee(推荐):https://gitee.com/cunzaizhe/xiaohuge-blog

github:https://github.com/tigerleeli/xiaohuge-blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【原创】H3C三层交换机的路由模式

网络拓扑图 将三层交换机当路由器使用 交换机配置 <H3C>dis stp briefMST ID Port Role STP State Protection0 GigabitEthernet1/0/1 DESI LEARNING NONE0 GigabitEthernet1/0/2 …

docker常用中间件安装

文章目录 1、前言2、中间件安装2.1、mysql2.2、gitlab容器2.3、nacos2.4、redis2.5、xxljob2.6、zipkin2.7、sentinel2.8、seata2.8.1、获取镜像2.8.2、运行容器并获取配置 2.9、rockerMQ2.9.1、rockerMQ-namesrv2.9.2、rockerMQ-broker2.9.3、rockerMQ-console 2.10、jenkins2…

java企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

文件分片上传

概要 在日常开发中上传文件是常见的功能&#xff0c;像使用 SpringBoot 作为服务端接收上传的文件是很方便的&#xff0c;但是默认情况下 SpringBoot 为我限定了单次上传文件的大小&#xff0c;默认是1MB&#xff0c;当我们单次上传的大小超过1MB的时候就会报错&#xff0c;这…

Vmware虚拟机操作系统和本地操作系统互Ping要求、解决方式讲解

Vmware虚拟机操作系统和本地操作系统互Ping讲解 在虚拟化环境中&#xff0c;如VMware&#xff0c;虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;和本地操作系统之间进行Ping测试是一项常见的任务。Ping测试可用于检查虚拟机是否能够与本地操作系统或其他网…

wap2app 隐藏系统状态栏

一、首先创建wap2App项目 1、文件》新建》项目 2、选择Wap2App项目&#xff1a;输入项目名称、网站首页地址&#xff08;如果是本地localhost的话改为你的IP地址即可&#xff09;&#xff0c;点击创建 二、创建完wap2App项目后 隐藏系统状态栏只要修改1、2选项即可 1、找到根…

智慧工地源码 智慧大屏、手机APP、SaaS模式

一、智慧工地可以通过安全八要素来提升安全保障&#xff0c;具体措施包括&#xff1a; 1.安全管理制度&#xff1a;建立科学完善的安全管理制度&#xff0c;包括安全标准规范、安全生产手册等&#xff0c;明确各项安全管理职责和要求。 2.安全培训教育&#xff1a;对工地人…

港科夜闻|香港科大商学院李莹莹教授获研究资助局(RGC)授予研资局高级研究员头衔...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大商学院李莹莹教授获研究资助局(RGC)授予“研资局高级研究员”头衔。李教授的研究项目“金融风险大数据”将利用金融大数据进行严谨、全面的统计研究&#xff0c;更准确地进行风险评估和预测&#xff0c;构建高质…

Linux内核开启BBR加速

升级内核 BBR 模块从 4.9 版本的内核中开始支持&#xff0c;CentOS7 的发布版标配的是 kernel-3.10&#xff0c;所以首先需要升级内核到大于等于 4.9 的版本&#xff0c;然后再更改设置开启 BBR。 查看内核版本 1) uname -r 3.10.0-1160.71.1.el7.x86_64YUM方式升级安装 1&…

跨境做独立站,如何低成本引流?

大家都知道&#xff0c;海外的消费习惯与国内不同&#xff0c;独立站一向是海外消费者的最喜欢的购物方式之一&#xff0c;这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台&#xff0c;其他平台可以靠平台自身流量来获得转化&#xff0c;而独立站本身没有流…

django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

运行django测试用例报错django.core.exceptions.AppRegistryNotReady: Apps arent loaded yet. 解决&#xff1a;在测试文件上方加上 django.setup() django.setup()是Django框架中的一个函数。它用于在非Django环境下使用Django的各种功能、模型和设置。 在常规的Django应用…

63.C++ mutable关键字

mutable 是C中的一个关键字&#xff0c;它用于修饰类的成员变量。当一个成员变量被声明为 mutable 时&#xff0c;它将允许在常量成员函数中修改这个成员变量的值&#xff0c;即使这个成员函数被声明为 const。 常量成员函数是类的成员函数&#xff0c;它们承诺不会修改类的成…

构建现代应用:Java中的热门架构概览

文章目录 1. 三层架构2. Spring框架3. 微服务架构4. Java EE&#xff08;Enterprise Edition&#xff09;5. 响应式架构6. 大数据架构7. 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;8. 安卓开发架构结论 &#x1f389;欢迎来到Java学习路线专栏~…

【算法竞赛宝典】猴子吃桃

【算法竞赛宝典】猴子吃桃 题目描述代码展示答案 题目描述 代码展示 //猴子吃桃 #include <iostream>using namespace std;int main() {int day 9, x1, x2 1;while (day > 0) {x1 (x2 1) * 2;//第&#xff11;天的桃子数是第&#xff12;的天的桃子数加&#xff…

[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。

本插件可以在虚幻的蓝图 Actor&#xff0c; Obiect&#xff0c;UMG 里面指定绑定和执行消息&#xff0c;可带自定义参数。 参数支持 Bool&#xff0c;Byte&#xff0c;Int&#xff0c;Int64&#xff0c;Float&#xff0c;Name&#xff0c;String&#xff0c;Text&#xff0c;Ve…

自定义spring-boot-start的jar包被引用时,提示找不到bean

类似这个报错&#xff1a; 重点要看一下我们自定义的start包下的config配置 BeanConditionalOnProperty(prefix "file", value "iSenable", havingValue "true")public FileServiceTemplate fileServiceTemplate(){return new FileServiceTe…

开开心心带你学习MySQL数据库篇之二

如何增大自己进入大厂的概率? 作业写得扎实,博客写得扎实,github/gitee搞的扎实 > 进入大厂的概率就会超过其他同学. 对于最近java行业有点饱和的看法? 大家不要只关注编程语言,这就把路走窄了!!! ~~ 投简历的时候,各种相关的岗位都是可以尝试的 ~~ 除了投后端开发,还…

Lliux管理员一些小技巧

1、查看bash日志 history命令显示日期和时间 2、打印时候对行列转换 xargs命令是改变已存在的文件的输出格式。“cat 文件名”是根据文件的行分隔符输出显示在屏幕上。如想改变一下&#xff0c;想把所有行合并为一行&#xff0c;就可以使用管道及xargs命令。 cat 文件名 |…

Bevformer:通过时空变换从多摄像机图像学习鸟瞰图表示

论文地址&#xff1a;BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers 代码地址&#xff1a;https://github.com/zhiqi-li/BEVFormer 论文背景 三维视觉感知任务&#xff0c;包括基于多摄像机图像的三维检测…

外贸soho不要随便给客户推荐供应商

我们常常以为大公司做事会更稳妥&#xff0c;更有保障&#xff0c;很多时候愿意选择大公司合作&#xff0c;为的就是图个心安&#xff0c;最近碰到的事实恰好相反&#xff01; 事情经过是这样的&#xff0c;有个客户除了找家具之外&#xff0c;还找很多其他的产品&#xff0c;…