计算机原理系列

欢迎大家关注「海拉鲁知识大陆」 多交流不迷路

计算机原理(一)

继续上一篇计算机原理(一)深入了解程序执行部分,进一步说说程序在冯诺依曼模型上如何执行。如果没有了解的童鞋可以查看我上一篇文章。

1.程序的执行过程

当 CPU 执行程序的时候:
1.第一步,CPU 读取 PC 指针指向的指令,将它导入指令寄存器。完成读取指令这件事情有 3 个步骤:

  • 步骤 1:CPU 的控制单元操作地址总线指定需要访问的内存地址(简单理解,就是把 PC 指针中的值拷贝到地址总线中)。
  • 步骤 2:CPU 通知内存设备准备数据(内存设备准备好了,就通过数据总线将数据传送给 CPU)。
  • 步骤 3:CPU 收到内存传来的数据后,将这个数据存入指令寄存器。
    完成以上 3 步,CPU 成功读取了 PC 指针指向指令,存入了指令寄存器。

2.然后,CPU 分析指令寄存器中的指令,确定指令的类型和参数。
3.如果是计算类型的指令,那么就交给逻辑运算单元计算;如果是存储类型的指令,那么由控制单元执行。
4.PC 指针自增,并准备获取下一条指令。
图片

2.详解a=11+15的程序执行过程

上面我们了解了基本的程序执行过程,接下来我们来看看如果用冯诺依曼模型执行a=11+15是一个怎样的过程。

当我们写的程序a=11+15是字符串,CPU只能执行指令。所以这里需要用到编译器。编译器的核心能力是翻译,它把一种程序翻译成CPU可执行的语言。比如java语言就是把.java转换成.class文件类加载到JVM通过解释器和即时编译器(JIT Compiler)执行字节码指令(这里大概了解下,后面我会单独讲讲JVM工作原理)。
下面我们来详细阐述a=11+15的大体执行过程:

1.编译器通过分析,发现11和15是数据,因此编译好的程序启动时,会在内存中开辟出一个专门的区域存这样的常数,这个专门用来存储常数的区域,就是数据段,如下:

  • 11 被存储到了地址 0x100;
  • 15 被存储到了地址 0x104;
    图片

2.编译器将a=11+15转换成了 4 条指令,程序启动后,这些指令被导入了一个专门用来存储指令的区域,也就是正文段。如上图所示,这 4 条指令被存储到了 0x200-0x20c 的区域中:

  • 0x200位置的load指令将地址0x100中的数据11导入寄存器R0;
  • 0x204位置的load指令将地址0x104中的数据15导入寄存器R1;
  • 0x208位置的add指令将寄存器R0和R1中的值相加,存入寄存器R2;
  • 0x20c位置的store指令将寄存器R2中的值存回数据区域中的0x1108位置。

3.具体执行的时候,PC指针先指向0x200位置,然后依次执行这4条指令。

3.指令

在上面的例子中,load 指令将内存中的数据导入寄存器,我们写成了 16 进制:0x8c000100,拆分成二进制就大体如下:
图片

  • 最左边的6位,叫作操作码,英文是OpCode,100011代表load指令;
  • 中间的4位0000是寄存器的编号,这里代表寄存器R0;
  • 后面的22位代表要读取的地址,也就是0x100。

所以我们是把操作码、寄存器的编号、要读取的地址合并到了一个32位的指令中。
我们再来求加法运算的 add 指令,16进制表示是0x08048000,换算成二进制就是:
图片

  • 最左边的6位是指令编码,代表指令 add;
  • 紧接着的4位 0000 代表寄存器 R0;
  • 然后再接着的4位 0001 代表寄存器 R1;
  • 再接着的4位 0010 代表寄存器 R2;
  • 最后剩下的14位没有被使用。

构造指令的过程,叫作指令的编码,通常由编译器完成;解析指令的过程,叫作指令的解码,由CPU完成。由此可见CPU内部有一个循环:

  • 首先CPU通过PC指针读取对应内存地址的指令,单词就是Fetch 。
  • CPU对指令进行解码,单词就是Decode。
  • CPU执行指令,单词就是Execution。
  • CPU将结果存回寄存器或者将寄存器存入内存,单词就是Store。
    图片
    上面4个步骤,就是CPU的指令周期。CPU的工作就是一个周期接着一个周期,周而复始。

4.指令的类型

通过上面的例子,不同类型的指令、参数个数、每个参数的位宽,都不一样。而参数可以是以下这三种类型:

  • 寄存器;
  • 内存地址;
  • 数值(一般是整数和浮点)。

当然,无论是寄存器、内存地址还是数值,它们都是数字。
指令从功能角度来划分,大概有以下 5 类:

  • I/O 类型的指令,比如处理和内存间数据交换的指令 store/load 等;再比如将一个内存地址的数据转移到另一个内存地址的 mov
    指令。
  • 计算类型的指令,最多只能处理两个寄存器,比如加减乘除、位运算、比较大小等。
  • 跳转类型的指令,用处就是修改 PC 指针。比如编程中大家经常会遇到需要条件判断+跳转的逻辑,比如if-else,swtich-case、函数调用等。
  • 信号类型的指令,比如发送中断的指令 trap。
  • 闲置 CPU 的指令 nop,一般 CPU 都有这样一条指令,执行后 CPU 会空转一个周期。

指令还有一个分法,就是寻址模式,比如同样是求和指令,可能会有另个版本:

  • 将两个寄存器的值相加的 add 指令。
  • 将一个寄存器和一个整数相加的 addi 指令。
    另外,同样是加载内存中的数据到寄存器的 load 指令也有不同的寻址模式:
  • 比如直接加载一个内存地址中的数据到寄存器的指令la,叫作直接寻址。
  • 直接将一个数值导入寄存器的指令li,叫作寄存器寻址。
  • 将一个寄存器中的数值作为地址,然后再去加载这个地址中数据的指令lw,叫作间接寻址。

因此寻址模式是从指令如何获取数据的角度,对指令的一种分类,目的是给编写指令的人更多选择。

5.指令的执行速度

CPU其实是用石英晶体产生的脉冲转化为时钟信号驱动的,每一次时钟信号高低电平的转换就是一个周期,我们叫时钟周期。CPU的主频,说的就是时钟信号的频率。比如一个1GHz的CPU,说的是时钟信号的频率是1G。这就是我们买电脑熟悉的需要知道CPU的频率参数了,频率越高性能越好了。

这里再说明一下,不是每个时钟周期都可以执行一条指令。多数指令可能不在一个时钟周期完成,通常需要 2 个、4 个、6 个时钟周期。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】 工厂方法模式

系列文章目录 文章目录系列文章目录需要了解工厂制造细节吗?简单工厂模式实现工厂方法模式的实现简单方法? 工厂方法?总结需要了解工厂制造细节吗? 我们在前面的文章中为大家介绍了简单工厂模式,我们知道 简单工厂模式…

详解 Java 中的 CopyOnWriteArrayList

目录 【1】CopyOnWriteArrayList 简介 【2】核心原理 1.底层数据结构 2.写时复制机制 【3】CopyOnWriteArrayList常用方法及实例 1.添加元素方法 add () 2.获取元素方法 get () 3.删除元素方法remove() 【4】优缺点分析 【5】适用场景 【6】总结 【1】CopyOnWriteAr…

新手SEO优化快速起步教程

本教程专为SEO新手设计,帮助您快速上手优化工作。我们将一步步带您了解基础概念,包括高效挖掘关键词的方法、内容优化的核心技巧,以及网站基础设置的关键步骤。后续还会讲解提升排名的实用策略、如何监控效果并进行调整,确保您能系…

Minecraft图片搜索技巧

以下是更多专注 Minecraft 内容的高质量社区平台,涵盖建筑展示、模组/材质分享、实机截图、艺术创作等方向,按类型分类整理:---一、国际知名综合社区平台 特点 链接 CurseForge 模组/材质/数据包第一仓库,作者更新快,支…

数学建模-非线性规划(NLP)

1-理论知识介绍应用2-基于matlab实现非线性规划1)例1% 清除工作台和命令行 clear;clc; x0[0 0 0]; A [-1 1 -1]; b 0; [x,value] fmincon(f1,x0,A,b,[],[],[],[],nonlfun1) function f f1(x)f x(1)^2x(2)^2x(3)^28; end function [c,ceq] nonlfun1(x)c [x(1)…

人工智能学习:什么是seq2seq模型

一、seq2seq模型 Seq2Seq(Sequence-to-Sequence)模型是一种用于处理序列转换问题的深度学习模型,广泛应用于机器翻译、文本摘要、对话系统、语音识别等领域。Seq2Seq模型的核心思想是通过一个编码器(Encoder)将输入序列编码为一个固定长度的上下文向量(Context Vector),…

生态 | 华院计算与深至科技达成战略合作,携手推动AI+医学影像算法升级迭代

8月25日,华院计算技术(上海)股份有限公司(以下简称“华院计算”)与上海深至信息科技有限公司(以下简称“深至科技”)正式签署战略合作协议。双方将秉持“优势互补、资源共享、战略协同、共同发展…

详解MySQL环境变量配置及其在备份中的应用

正确配置MySQL环境变量是保障数据库稳定运行和高效管理的基础。这些变量涵盖了从内存分配、连接设置到日志行为等方方面面,直接决定了数据库的性能表现和功能特性。对于数据库管理员而言,熟练掌握环境变量的配置,是进行性能调优和故障排查的必…

scikit-learn零基础配置(含python、anaconda)

一、Anaconda环境搭建 1、关于Anaconda Anaconda 是一个非常 popular 的 Python 发行版,它不仅包含了 Python 语言本身,还预装了众多常用的科学计算库,如 NumPy、Pandas、Matplotlib 等,能够极大地方便用户的开发和数据分析工作。…

RAG提示词(日本語版)

RAG提示词(日本語版) System Message # 知能型質問応答アシスタント(RAGシステムプロンプト)## 役割定義 あなたは「知能型質問応答アシスタント」として、提供されたコンテキスト情報に基づいてユーザーの質問に回答する専門的な…

qData 数据中台【开源版】发布 1.0.5 版本,全面提升规则治理、非结构化数据处理与部署体验

2025年9月3日 —— 企业级开源数据中台 qData 开源版 正式发布 1.0.5 版本。本次更新聚焦 规则治理一体化、非结构化数据支持、以及开源版的体验与部署优化,进一步提升规则复用能力、数据接入广度与运维效率,帮助企业和开发者更轻松地构建高质量数据治理…

RecSys:用户行为序列建模以及DIN、SIM模型

引言 在推荐系统中,用户历史行为序列是极其重要的信息源。用户最近的点击、点赞、收藏、转发等行为能够有效反映其即时兴趣,无论是在召回、粗排还是精排阶段,合理利用这些行为序列都能显著提升推荐效果。本文将系统介绍用户行为序列建模的几…

QGIS二次开发01:环境配置-OSGeo4W镜像

写在前面: 本笔记根据多方资料整理而成,旨在为QGIS二次开发提供学习参考。内容仅供交流学习,欢迎共同探讨。 一、关于QGIS QGIS 是一个功能强大的桌面GIS软件本身,为用户提供了图形化界面(GUI)来进行地图制…

对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标

随着我国旅游行业的快速发展,游客安全需求日益凸显,安全应急处置能力已成为旅游服务人才的核心竞争力。旅游安全急救实训室作为旅游服务与管理专业中的重要教学场所,其功能构建与育人目标影响人才培养质量与行业安全水平。点击获取方案 一、行…

Typora处理markdown文件【给.md文档加水印】

①文件→偏好设置→外观→打开主题文件夹②在打开的文件夹中放入水印图像③右键点击github.css文件后,点击编辑,进入编辑页面④将代码块中内容粘贴到文件最后 更多效果请自行探索 #write::before {content: "CSDN果子当夜宵:bigxie.blog…

基于单片机的六足机器人控制系统设计

基于单片机的六足机器人控制系统设计摘 要本设计主要是基于单片机的六足机器人控制系统设计,综合分析六足机器人的结构、步态和控制算法,结合云端服务器、WIFI 技术、蓝牙技术、语音识别技术和手势识别技术进行多种控制模式的设计,并提出不同…

RK3568 Trust

文章目录1、环境介绍2、前言3、ARM TrustZone3.1、什么是ARM TrustZone3.2、cpu特权等级3.3、ARM Trusted Firmware4、Rockchip 平台的 Trust4.1、实现机制4.2、启动流程4.3、生命周期4.4、Trust 编译打包流程分析5、总结1、环境介绍 硬件:飞凌ok3568-c开发板 软件…

C语言数据结构——详细讲解《二叉树与堆的基本概念》

C语言数据结构——详细讲解《二叉树与堆的基本概念》前言一、树的基础概念1.1 为什么需要树?1.2 树的定义与结构1.3 树的核心术语1.3 树的核心术语1.4 树的表示方法(孩子兄弟表示法)结构定义为什么用孩子兄弟表示法?1.5 树的实际应…

STAR-CCM+|雷诺数回顾

【1】引言 前序已经学习了K-epsilon湍流模型溯源的基础知识,今天再学习一些更为基础的知识,回顾一下雷诺数ReReRe。 【2】雷诺数定义 雷诺数公式为: ReρvDμRe\frac{\rho vD}{\mu}ReμρvD​ 式中, ρ\rhoρ——流体密度&…

Java中的死锁

锁的合理使用能够保证共享数据的安全性,但是 使用不当也会可能引起死锁。1. 死锁概念 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求…