1.2 计算机硬件的基本组成

2024-08-26 07:52

本文主要是介绍1.2 计算机硬件的基本组成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.早期冯诺依曼计算机结构

世界上第一台计算机是ENIAC,需要手动接线来控制计算,所以它的计算速度受限,所以冯诺依曼提出了“存储程序”的概念,即将需要用到的指令以二进制的形式事先输入到计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直到程序执行结束。
在这里插入图片描述
早期冯诺依曼机的硬件结构图如图所示。

  • 输入设备:将信息转换成机器能够识别的形式,经过运算器存储在存储器里面。
  • 存储器:存放数据和程序。
  • 运算器:实现算术/逻辑运算。
  • 输出设备:将结果转换成人们所熟悉的形式。
  • 控制器:指挥程序运行

在计算机系统中,软件和硬件在逻辑上是等效的,即对于同一个功能,我们既可以用软件来实现,也可以用硬件来实现。比如:对于乘法运算,可以设计一个专门的硬件电路实现乘法运算,也可以用软件的方式,执行多次加法运算来实现。
在这里插入图片描述
冯·诺依曼计算机的特点:

  • 计算机由五大部件组成
  • 指令和数据以同等地位存于存储器,可按地址寻访
  • 指令和数据用二进制表示
  • 指令由操作码和地址码组成
  • 存储程序
  • 以运算器为中心

缺点:输入/输出设备与存储器的数据传送通过运算器完成,导致数据计算的效率降低

2.现代计算机结构

以存储器为中心,运算器和控制器统称为cpu,cpu+主存称为主机。
在这里插入图片描述
在这里插入图片描述

3.各个硬件的工作原理

(1)主存储器

主存储器里用于存放指令和数据的称为存储体,由一个一个的存储单元构成,除此之外,还有两个寄存器,分别是MAR(Memory Address Register,存储地址寄存器)和MDR(Memory Data Register,存储数据寄存器)。
CPU把数据存在存储器中某个位置,取数据时,CPU需要给MAR一个地址,根据这个地址可以找到对应的存储单元,取出相应的数据到MDR中。类比于菜鸟驿站里面的货架,对货架进行编号,取快递需要告诉店员你的取件号,根据取件号将快递放在柜台,就可以拿到快递了。
在这里插入图片描述
存储体由一个个的存储单元构成的,存储单元中存放了一串二进制代码,每一位二进制代码的存放需要一个存储元件,存储单元中二进制代码的组合又称为存储字,二进制的位数称为存储字长。
在这里插入图片描述

(2)运算器

运算器的主要功能是实现算术运算和逻辑运算。
主要部件:

  • ACC(Accumulator ):累加器,用于存放操作数,或运算结果。
  • MQ(Multiple-Quotient Register):乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
  • X:通用的操作数寄存器,用于存放操作数。
  • ALU(Arithmetic and Logic Unit): 算术逻辑单元,通过内部复杂的电路实现算术运算、逻辑运算。
    在这里插入图片描述

(3)控制器

控制器基本功能:产生指令执行过程所需要的所有控制信 号,控制相关功能部件执行相应操作。
基本组成:

  • CU(Control Unit ):控制单元,分析指令,给出控制信号。
  • PC(Program Counter):存放当前欲执行指令的地址,与MAR之间有一条直接通道,具有计数功能(PC)+ 1→PC。
  • IR(Instruction Register ) 存放当前执行的指令内容,来自主存的MDR。
    每完成一条指令需要分成3个阶段,第一个阶段为取指令,根据PC中的地址从内存中取出那条指令,取出的指令放在IR中,CU这个部件分析这条指令是要做什么的,分析完后控制其他部件完成这条指令
    在这里插入图片描述

(4)输入输出系统

输入设备:输入设备的任务是把编好的程序和原始数据送到计算机中去,并把它们转换成计算机能识别、能接受的信息形式。(键盘、鼠标、网卡、扫描仪等)

输出设备:输出设备的任务是把计算机的处理结果以人或者其它设备能接受的形式送出计算机。(显示器、声卡、网卡、打印机等)

4.计算机的工作过程

用C语言写了这样一段程序,定义了a,b,c,y 4个变量,执行了一个功能y=a*b+c,经过编译后变成机器语言装入到主存中。a,b,c,y 4个变量分别存放在5、6、7、8四个地址中,前5个地址存放机器指令。
在这里插入图片描述步骤:
取数操作:
(1)首先数据和指令存放在存储体中,在程序运行之前pc=0,指向第一条指令的存储地址,pc的值需要传给MAR,使得MAR的值为0;
(2)控制器向主存指明了接下来CPU要访问的是0号地址所对应的内容且是读操作,再根据MAR的内容找出0号地址所对应的二进制数据,并把这个数据给MDR。
(3)此时MAR的内容为00001 000000101
(4)将MDR的内容通过数据总线传给控制器的IR寄存器,(IR)=000001 0000000101
(5)将指令的操作码部分送到CU里进行分析,分析得知,这是“取数”指令
(6)将指令的地址码部分给MAR,导致(MAR)=5
(7)根据MAR的值找到对应的存储单元,取出a的值
(8)M(MAR)→MDR,导致(MDR)=0000000000000010=2
(9)(MDR)→ACC,导致(ACC)=0000000000000010=2

在这里插入图片描述

以此类推
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
从前面的步骤可知,任何一条指令的执行都需要经过取指令、分析指令和执行指令三个阶段。取指令和分析指令是必经步骤,执行指令不同的指令具体步骤不同。取指令阶段,MDR的数据肯定是要放到IR中,而在执行指令阶段,CU会根据这条指令来决定MDR数据放在ACC还是MQ中,所以根据指令周期的不同,CPU来区分取出来的是指令还是数据。
总结:
在这里插入图片描述

申明:本内容属于学习记录,如有侵权或者不对的地方,请联系作者进行更改。

这篇关于1.2 计算机硬件的基本组成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107980

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (