3.1 CPU内部结构与时钟与指令

CPU内部结构

  • 总线
  • 一些自定义部件
  • 总线图
  • 内存指令
  • 执行流程:取指令,译码,执行
  • pc做的事
  • 内存地址寄存器
  • 内存缓存寄存器
  • 指令寄存器,译码第一步
  • 指令寄存器传递地址到内存地址寄存器
  • 指令MOV_A的过程(译码第二步)
  • 第一条指令执行完毕
  • 第三条指令的执行
  • 第四条指令
  • 第四条指令不同的执行流程
  • 整体流程

内部数据总线

  • 使用到的有8位寄存器(用于输入),4位寄存器(用于内存地址,只能寻址16个内存单元[2^4]),简化版加法ALU
  • 寄存器带了时钟, 由时钟统一控制操作
  • ALU不需要时钟, 输入端的寄存器由时钟控制
  • 总线就是一根根传送电信号的线 -_-
  • 内部的意思就是封装在CPU内部的 -_-
  • 外部总线就是主板上的 _
  • 反正总线,就是一堆线
  • 但在任意时刻,只能由一个部件对其读/写,因此下面的所有部件都增加了 可写(WriteEnable) / 可读 (OutEnable,也可以叫可输出)
  • 在下面的图中有数据总线和地址总线,见名知意, 数据总线传送数据, 地址总线传送地址 ;- )
  • 注意,数据包含指令,都是二进制, 是数据还是指令由CPU本身去识别(x86,arm …) 下面的汇编指令是我自己模拟的

下面有CPU整个执行流程,由于没有控制单元,因此纯手工操作

一些CPU内部需要用到的部件

简化版加法ALU

  • 图上的C是进位,目前恒为零即可
    在这里插入图片描述

4位寄存器,用于内存地址

在这里插入图片描述

8位寄存器,用于输入

在这里插入图片描述

总线图

  • 时钟使用按钮代替
  • 时钟用于让所有的电路自动工作,每触发一次,所有的相连的寄存器就工作一次
  • 总的来说时钟是一切电路自动化工作的源头
  • 古代碾磨需要一头牛来转圈,牛跑的越快碾磨速度越快, 振荡器速度越快,频率越高
  • 而时钟的取名我猜就是类似 , 下一时刻时钟吼了一句"大家一起干活!"(脉冲信号),让所有的相连的电路一起干活
  • 时钟的另一个作用是编程中的术语来说就是同步
  • 例如:
  • mov 寄存器B,0x99;
  • mov 寄存器A, 寄存器B
  • 寄存器B中的值有没有准备好? 什么时候能执行mov操作?
  • ip/Eip什么时候往下移动?
  • 一旦有了时钟,就容易同步操作

在这里插入图片描述

从内存中读取指令

  • 为简化汇编指令, 这里只使用4条指令来演示, 自己模拟的汇编指令
  • 汇编指令一般都有 操作码 ,操作数 2个部分组成
  • 操作码对应要做什么, 操作数对应要对这个数做什么操作,在这里操作数只能对内存地址寻址
操作码操作码二进制解释
MOV_A1000复制数据到寄存器A
MOV_B1001复制数据到寄存器B
MOV_TO_ADDR1010复制寄存器C的数据到内存地址
ADD1011把寄存器A,B相加存放到寄存器C

指令相关

  • 为简化指令,每个操作码固定占用4位,操作数也占用4位, 一个字节即可存放
  • 操作码放高4位,操作数放低4位
  • 当前的寻址寄存器是4位,只能寻址16个地址线,因此对应操作数来说正好
  • 注意这里的操作数只能是内存地址

指令举例

操作码操作码二进制操作数二进制解释内存数据对应汇编伪指令
MOV_TO_ADDR10100010把寄存器C的数据复制到内存地址0010(0x02)10100010mov [0010], c
MOV_A10001111把内存地址0xF的数据复制到寄存器A10001111mov a,[0x0f]
MOV_B10011101把地址0x0D的数据复制到寄存器B10011101mov b,[0x0D]
ADD1011ADD没有操作数,固定只会寄存器A+B,输出到寄存器C10110000add a,b; mov c,a
  • 下面内存中的4条指令是
指令二进制指令解释
10001010把地址1010的数据加载到寄存器A
10011111把地址1111的数据加载到寄存器B
10110000把寄存器A,B相加存放到寄存器C
10101111把寄存器C的数据复制到地址1111处

在这里插入图片描述

取指令,处理指令(译码),执行

  • 所涉及到的几个部件
  • PC: 程序位置计数器, 由于当前内存中只有4条指令,因此特意把PC设置成2位的计数器,0000 ~ 0011,但内存地址寄存器是4位的,所以把高2位设置成0
  • 内存地址寄存器 - MAR , 4位寄存器(最大寻址16字节)
  • CPU指令寄存器 - IR , 8位寄存器
  • 内存缓存寄存器 , 8位寄存器
  • 外部内存 (外部是意思是 相对于 其他寄存器都是CPU内部的 ), 内存只有16字节
  • CPU数据外部总线和内部数据总线,地址总线这3根线的位宽取决于相连部件的输出,例如:
    1. PC输出的位宽是4位,内部地址总线位宽则是4
    1. 内存输出的位宽是8位, 外部数据总线的位宽是8
  • 下面分部说明每个部件要干的活
    在这里插入图片描述

PC所做的事

  • 2位的计数器,因为内存中只有4条指令
  • 输出端连接CPU内部地址总线,传输到 内存地址寄存器
  • 但内存地址寄存器输入端是4位的,因此把PC的高2位置0
  • 告诉 内存地址寄存器, 当前需要去获取哪个位置(地址)
  • 当前PC的计数为0,因此传递过去也是0
  • 把当前计数器的位置输出到 内存地址寄存器
  • 把自身+1, PC 所存放的永远是下一条指令的位置
  • 如下图所示,一开始会打开PC的OE(out Enable), 打开内存地址寄存器的WE(Write Enable), 时钟一叫唤,他俩开始工作
  • 接下去, 关闭其他状态, 开启PC的WE, 时钟一叫, PC自身+1
    在这里插入图片描述

内存地址寄存器

  • 此寄存器用于传递地址
  • 输入端连接CPU内部地址总线,输出端连接CPU外部地址总线, 总线连接到内存
  • 两种情况:
  • 1.把PC告诉自己的地址输出到CPU外部地址总线所相连的内存
  • 2.把指令寄存器输出的地址, 传输与CPU外部地址总线相连的内存(这一步下面的指令寄存器有说明)

内存缓存寄存器

  • 这个寄存器与CPU内部数据总线相连, 也跟外部数据总线相连
  • 这个内外相连的寄存器:
    1. 写入端: 外部数据总线能对其写入, 内部数据总线也能对其写入
    1. 输出端: 能输出到外部数据总线,也能输出到内部数据总线
  • 下图所示:
    1. 从内存地址寄存器(地址0000,此地址由PC传递过来) 通过地址总线传送到内存
    1. 内存把对应的二进制数据 通过 外部数据总线 传送到 内存缓存寄存器
    1. 此时,缓存寄存器有了数据,接着会把数据传递到指令寄存器
    1. 当前获取的内存地址:0000 中的二进制是10001010 => 16进制0x8A
  • 此二进制是一条汇编指令,上面说过
通过内存地址寄存器传输到内存,内存输出到外部数据总线,再传输进内存缓存寄存器

在这里插入图片描述

内存缓存寄存器通过内部数据总线传输到指令寄存器

在这里插入图片描述

指令寄存器

  • 上面说过, 内存缓存寄存器 同时连接外部数据总线和内部数据总线
  • 内存缓存寄存器 将把获取的数据传送到 指令寄存器
  • 此时 指令寄存器 内含的数据:0x8A(10001010)
    1. 10001010对应的指令是MOV_A:把1010地址的数据传送到寄存器A
    1. 高4位1000 是 自己模拟的汇编指令:MOV_A, 把数据复制到寄存器A的操作码
    1. 由于我自己模拟的汇编指令, 低4位都是需要从内存地址处获取数据(非立即数),因此将再次把低4位 1010 传递给 内存地址寄存器
  • 一旦指令寄存器获取数据后,开始译码,这是一条MOV_A指令,后面低4位地址需要再次获取,因此将把低4位传送到内存地址寄存器
  • 下图所示,指令寄存器低4位(0-3位)输出到 CPU内部地址总线 进而 传递进 内存地址寄存器
指令寄存器将低4位传送到内存地址寄存器

在这里插入图片描述

传送动图

在这里插入图片描述

回到内存地址寄存器,外部内存,内存缓存寄存器

  • 内存地址寄存器获取4位地址后再次通过外部地址总线传递到内存
  • 内存将此地址的1个字节的数据通过外部数据总线传送到 内存缓存寄存器
  • 内存缓存寄存器将又一次把数据通过 内部数据总线 传送到 指令寄存器
    1. 这次传送过程中, 内存地址寄存器将地址0x0A(1010)传送给内存
    1. 内存地址0x0A所存放的数据是:0x08
    1. 内存缓存寄存器此时还保留着上次的值:0x8A,经过外部数据总线传送进来后,数据变成了:0x08
将指令寄存器传送的地址,传送到内存地址寄存器,通过外部地址总线,传送到内存,再通过外部数据总线传送到内存缓存寄存器
内存数据

在这里插入图片描述

数据传递动图

在这里插入图片描述

指令MOV_A的过程(译码)

  • 译码:根据指令,执行相对应的操作,在这就是需要把数据复制到寄存器A
  • 根据上面流程, 此时 指令寄存器的高位 1000, 对应MOV_A, 地址:1010 对应的内存数据也传送到 内存缓存寄存器中
  • 接下来就要开始执行指令了,把 内存缓存寄存器的数据通过内部数据总线传送到 寄存器A 中
  • 注:内存缓存寄存器的输出端连接内部数据总线,也连接外部数据总线
内存缓存寄存器的数据传递到寄存器A

在这里插入图片描述

到此内存中的第一条指令执行完毕

内存地址指令二进制指令解释执行完成
0x0010001010把地址1010的数据加载到寄存器AYes
0x0110011111把地址1111的数据加载到寄存器BNo
0x0210110000ADDNO
0x0310101111把寄存器C的数据复制到地址1111处NO
  • 第二条指令与第一条指令类似,除了内存地址和寄存器不同,其他一致
  • 这里就省略第二条指令的执行流程

开始第三条指令的执行

  • 先回忆下前面的流程, 第一条指令执行完后PC的值:1
  • PC的特性是:永远指向下条指令位置
  • 第二条指令开始时
    1. 先把PC传送到内存地址寄存器
    1. 然后PC自身+1, 此时PC的值:2
    1. 省略其他流程
    1. 地址1111(0x0f)的数据是0x01.因此寄存器B的数据是:0x01
  • 当第二条指令执行完毕后PC的值:2,也就是指向了第三条指令: 10110000 => ADD
  • 第三条指令简述步骤:
    1. PC输出-> 内存地址寄存器 -> PC +1
    1. 内存地址寄存器 -> 内存 -> 写入内存缓存寄存器
    1. 内存缓存寄存器 -> 指令寄存器
    1. 指令寄存器开始译码
    1. 译码:此时这是一条ADD指令,不需要再去传送地址,直接让寄存器A,寄存器B 传送到 8位ALU加法器 中
    1. 最后ALU输出的结果存放到寄存器C中
下图是执行完第二条指令的状态图

在这里插入图片描述

执行第三条指令,直到指令被放入指令寄存器中

在这里插入图片描述

指令寄存器开始译码并执行

在这里插入图片描述

开始第四条指令

  • 第四条指令简述步骤:
    1. 这条指令后,PC将回归0, 意味着这条指令执行完后,又会重新回到第一条指令
    1. PC->内存地址寄存器 -> PC+1(溢出,PC此时又回到了0,PC是2位寄存器)
    1. 内存地址寄存器 -> 内存 -> 内存缓存寄存器
    1. 内存缓存寄存器 -> 指令寄存器
    1. 这是一条MOV_TO_ADDR指令:10101111(0xAF)
    1. 指令寄存器开始译码
    1. 译码:这是一条把寄存器C复制到内存地址的指令
下图是执行第四条指令,直到指令被传送到指令寄存器中

在这里插入图片描述

第四条指令的不同

    1. 这和之前的指令都不一样,之前的指令是读取内存,现在需要写内存
    1. 不仅需要指定内存地址,也需要把数据准备好,指定在哪个地址上写什么数据
    1. 内存缓存寄存器 即连接内部数据总线,也连接外部数据总线,因此需要把寄存器C的数据输出到 内存缓存寄存器中
    1. 对于内存地址的指定,就需要依靠由 指令寄存器分离的低4位传递到 内存地址寄存器中
    1. 需要准备好的寄存器有: 寄存器C, 内存缓存寄存器,指令寄存器, 内存地址寄存器
    1. 数据: 通过寄存器C 传递到内存缓存寄存器;
    1. 地址: 通过指令寄存器分离的低4位,传递到内存地址寄存器
    1. 在数据和地址准备好后, 写入进: 内存缓存寄存器,内存地址寄存器, 下图1
    1. 此时有了数据和地址, 需要再次往内存写入地址和数据,下图2
    1. 往内存写完后,又会循环到第一条指令(PC=0)
图1. 把数据和地址分别传送给内存地址寄存器,内存缓存寄存器

在这里插入图片描述

图2. 把内存缓存寄存器和内存地址寄存器的数据写入内存

在这里插入图片描述

整体流程,全程手动,老夫累了

  • 0.step 0 , PC
    1. 清空状态(把其他开关全关了)
    1. 打开PC OE, 打开 内存地址寄存器 WE
    1. PC 输出位置(2位) 到 内存地址寄存器
    1. 清空状态
    1. 打开 PC WE, PC自身加1 (永远指向下一条位置)
  • 1.step 1,内存地址寄存器传送地址,内存缓存寄存器获取数据
    1. 清空状态
    1. 打开 内存地址寄存器 OE, 打开 内存缓存寄存器 WE, 打开 内存 OE
    1. 通过 内存地址寄存器 传输地址到内存
    1. 内存收到的地址把此地址的一个字节(二进制不分[数据,指令])通过外部数据总线 传输到 内存缓存寄存器
  • 2.step 2, 内存缓存寄存器把数据传送到指令寄存器
    1. 清空状态
    1. 打开内存缓存寄存器OE,打开指令寄存器WE,时钟一吼,立即传送到位
  • 3.step 3,指令寄存器干活
    1. 清空状态
    1. 开始译码
    1. 拆分1个字节,高4位操作码,低4位操作数(内存地址)
    1. 如果操作码是ADD,则跳转到step 7
    1. 如果操作码是MOV_TO_ADDR,跳转到step 8
    1. 如果操作码是MOV_A,MOV_B则往下执行
    1. 把低4位的地址传送到 内存地址寄存器
    1. 打开内存地址寄存器WE,打开 指令寄存器OE,时钟一吼,低4位的地址就传送到了 内存地址寄存器
  • 4.step 4, 执行一次step 1, 传递地址获取内存数据
    1. 执行一次step 1,此时 内存缓存寄存器中有了数据
    1. 这个时候根据指令本身来执行(译码),此时指令寄存器中的指令是1000,即MOV_A,因此需要把数据传送到寄存器A
  • 5.step 5, 把数据传送到寄存器A
    1. 清空状态
    1. 打开 内存缓存寄存器的OE, 打开寄存器A的WE,时钟脉冲一到, 一个字节的数据通过 CPU内部数据总线传送到了寄存器A,一条指令执行完毕
  • 6.step 6, 回到step 0
  • 7.step 7, 执行ADD
    1. 清空状态
    1. 打开寄存器A,寄存器B的OE,打开ALU的OE,打开寄存器C的WE, 时钟一到, A+B的结果就被存放在了寄存器C
    1. ADD执行完毕,回到step 0
  • 8.step 8, 执行MOV_TO_ADDR
    1. 清空状态
    1. 准备好数据与地址,打开指令寄存器OE,打开内存地址寄存器WE,打开寄存器C的OE, 打开内存缓存寄存器的WE,时钟一喊, 地址和数据都准备完成
    1. 清空状态
    1. 打开 内存地址寄存器OE, 打开 内存缓存寄存器OE,打开 内存WE (往内存的某个地址上写数据)
    1. 至此最后一条指令执行完毕
    1. 再次回到step 0, 此时PC:0,因此将循环往复的从头执行

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

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

相关文章

基于python+TensorFlow+Django算法模型的车辆车型识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介简介技术栈主要模块1. 数据预处理2. 模型构建3. 模型训练4. 模型集成5. 用户界面 系统工作流程未来改进计划 二、功能三、系统四. 总结 一项目简介 # 车辆车…

深信服实验学习笔记——nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式 1. 主机存活探测 nmap -sP <靶机IP>-sP代表 2. 常见端口扫描、服务版本探测、服务器版本识别 推荐加上-v参…

DNS/ICMP协议、NAT技术

目录 DNS协议DNS背景域名简介 ICMP协议ICMP功能ping命令traceroute命令 NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器 网络协议总结应用层传输层网络层数据链路层 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&…

基于51单片机的公交自动报站系统

**单片机设计介绍&#xff0c; 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统&#xff1a; 公交自动报…

吉他初学者学习网站搭建系列(1)——目录

文章目录 背景文章目录功能网站地址网站展示展望 背景 这个系列是对我最近周末搭建的吉他工具类平台YUERGS的总结。我个人业余爱好是自学吉他&#xff0c;我会在这个平台中动手集成我认为很有帮助的一些工具&#xff0c;来提升我的吉他水平和音乐素养&#xff0c;希望也可以帮…

【Linux】指令详解(三)

目录 1. 前言2. 常见指令2.1 重定向2.1.1 >2.1.2 >>2.1.3 < 2.2 与文件有关指令2.2.1 more2.2.2 less &#xff08;推荐使用&#xff09;2.2.3 head2.2.4 tail2.2.5 wc2.2.6 | 2.3 find2.4 grep 3. 时间相关的指令3.1 data3.2 时间戳3.3 cal 4. zip/unzip 1. 前言 …

rsyslog学习

rsyslog是什么 RSYSLOG&#xff08;Remote System Logging&#xff09;是一个开源的日志处理工具&#xff0c;用于在 Linux 和 Unix 系统上收集、处理和转发日志。它是一个健壮且高性能的日志处理程序&#xff0c;可以替换 Syslogd 作为标准的系统日志程序。RSYSLOG 提供了许多…

力扣学习笔记——239. 滑动窗口最大值

力扣学习笔记——239. 滑动窗口最大值 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输…

第96步 深度学习图像目标检测:FCOS建模

基于WIN10的64位系统演示 一、写在前面 本期开始&#xff0c;我们继续学习深度学习图像目标检测系列&#xff0c;FCOS&#xff08;Fully Convolutional One-Stage Object Detection&#xff09;模型。 二、FCOS简介 FCOS&#xff08;Fully Convolutional One-Stage Object D…

Javaweb之Vue组件库Element的详细解析

4 Vue组件库Element 4.1 Element介绍 不知道同学们还否记得我们之前讲解的前端开发模式MVVM&#xff0c;我们之前学习的vue是侧重于VM开发的&#xff0c;主要用于数据绑定到视图的&#xff0c;那么接下来我们学习的ElementUI就是一款侧重于V开发的前端框架&#xff0c;主要用…

两年功能五年自动化测试面试经验分享

最近有机会做一些面试工作&#xff0c;主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色&#xff0c;经历了不少次的面试之后&#xff0c;多少也积累一点面试的经验&#xff0c;现在发生了角色转变。初次的面试就碰到个工作年限比我长的&#xff0c;也没有时…

【数据结构实验】排序(一)冒泡排序改进算法 Bubble及其性能分析

文章目录 1. 引言2. 冒泡排序算法原理2.1 传统冒泡排序2.2 改进的冒泡排序 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果5. 实验结论 1. 引言 排序算法是计算机科学中一个重要而基础的研究领域&…

AndroidStudio2022.3.1 Patch3使用国内下载源加速

记录一下这个版本的as在使用国内下载源加速碰到的诸多问题。 一、gradle-8.0-bin.zip下载慢 编辑项目文件夹/gradle/wrapper/gradle-wrapper.properties&#xff0c;文件内容改为如下&#xff1a; #Fri Nov 24 18:50:06 CST 2023 distributionBaseGRADLE_USER_HOME distribu…

井盖位移传感器怎么监测井盖安全

井盖在城市基础设施建设中扮演着不可或缺的角色&#xff0c;虽然看似并不起眼但确实是城市规划中一个重要的组成部分。在城市规划建设之初都需要首先考虑排水系统的设计&#xff0c;而井盖作为排水系统的一个重要组成部分&#xff0c;一旦出现问题便会造成交通中断或者环境受影…

1panel可视化Docker面板安装与使用

官网地址1Panel - 现代化、开源的 Linux 服务器运维管理面板 文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 1.安装命令 2.一些命令 3.使用 总结 前言 一、环境准备 虚拟机centos 已经安装好docker和 Docker Compose 或者都没安装 1panel会帮你自动安装 二、使用…

【腾讯云云上实验室】向量数据库相亲社交应用实践

快速入口 &#x1f449;向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com) 文章目录 前言1. 向量数据库概念及原理1.1 向量数据库概念1.2 向量数据库核心原理1.3 向量数据库优缺点1.4 向量数据库与传统数据库的区别 2. 腾讯云向量数据库的基本特性及优…

Linux学习笔记之六(进程之间的管道通信和信号处理)

目录 1、管道通信1.1、无名管道1.1、有名管道 2、信号处理2.1、信号的种类和发送2.2、信号的接受和处理 1、管道通信 管道通信是一个设备中进程与进程之间通信的一种方式&#xff0c;分为无名管道和有名管道两种。前者只能用于有亲缘关系的进程之间的通信&#xff0c;如父子进…

Proteus仿真--用DS1302与12864LCD设计的可调式中文电子日历

本文主要介绍用DS1302和12864 LCD的可调式中文电子日历&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中12864LCD上面显示中文年月日信息时间信息&#xff0c;按键K1-K4&#xff0c;K1用于年月日时分选择&#xff0c;K2用于加功能&#xff0c;K3用于…

CSS水平居中与垂直居中的方法

当我们页面布局的时候&#xff0c;通常需要把某一个元素居中&#xff0c;这一篇文章为大家介绍一下居中的几种方法&#xff0c;本人文笔有限&#xff0c;请见谅&#xff01; 一.水平居中 行内元素水平居中的方法&#xff0c;我们使用text-align:center; <!DOCTYPE html&g…

夜神模拟器 burp抓包 ADB 微信小程序

夜神模拟器 burp抓包 ADB 微信小程序 初始环境准备应用连接证书转换设置夜神模拟器环境ADB配置测试burp抓包 初始环境准备 既然想了解如何抓包&#xff0c;我想大多数是已经安装好 夜神模拟器 和 Burp 了&#xff0c;这里就不在赘述&#xff0c;直接开始操作。 openssl 的下载…