当前位置: 首页 > news >正文

1.1组合电路、时序电路在计算机课程中的地位

这个题目是我临时想的,不知道是否准确,一直想写一个类似的东西,希望能够引起童鞋们关注硬件并喜欢上硬件。

我是文科出生,研究生阶段才转向计算机,中间有很长一段时间都只做软件理论相关研究和一些具体的软件项目,包括编译器、电力系统监控器、软件测试工具研发等;直到2009年,才开始陆陆续续接触一些硬件项目,说是硬件项目,其实主要是一些嵌入式的项目,如世界杯前做的3G转Wifi和自己玩的一些小车和传感器等。

在做嵌入式项目之前,压根就没接触过硬件方面的开发知识,难度可想而知,什么叫编码器、什么叫译码器、怎么做分频、怎么做倍频、怎么做A/D转换、D/A等等,一系列的问题迎面而来。为了完成项目,只能硬着头皮上,从最基础的数字逻辑开始看起,从二进制、卡诺图入手,逐渐深入到组合电路和时序电路,再结合一本叫做《计算机组成与设计-硬件/软件接口》,才逐渐深入明白我们做的编译器后端的具体工作原理,在此基础上对软件的各种性能问题有了更深刻的认识。

组合电路和时序电路是计算机原理的基础课,组合电路描述的是单一的函数功能,函数输出只与当前的函数输入相关;时序电路则引入了时间维度,时序电路在通电的情况下,能够保持状态,电路的输出不仅与当前的输入有关,而且与前一时刻的电路状态相关,如我们个人PC中的内存和CPU中的寄存器,均为时序电路。

说了这么多,我们学习的组合电路和时序电路在计算机中又是怎么一回事呢?为了便于理解,下面以一个大家都能接受的C语言程序开始,从上层向下层开始解释。

void main(){
      int a = 3, b = 5;
      int sum = a + b; }
  • 1
  • 2
  • 3
  • 4

这个例子大家都能明白,main函数要做的事情就是实现两个数的加法操作。这是我们人类的思维方式,但是计算机并不认识,如何让计算机理解呢?于是,我们需要将上面这个程序翻译成机器能理解的模样,这时候就需要借助编译器(如常见的gcc、msc等)将上面的程序翻译成MIPS指令(不同的CPU有不同的指令集,包括X86指令集、MIPS指令集、Sparc指令集等,我们在这里用MIPS指令集,咱们的龙芯也是采用MIPS指令集),如下所示:

 addi   $t0, 0, 3    # a = 0+3, a保存在$t0寄存器中, 对应的二进制代码为:0010 00** **** **** **** **** **** ****(这里的星号*表示二进制,这里暂时不关心)
 addi   $t1, 0, 5 # b = 0+5, b保存在$t1寄存器中 addi $t2, $t1, $t0 # sum = a + b, sum保存在$t2寄存器中
  • 1
  • 2
  • 3

到这里,大家一定还在疑惑,不是说要翻译成二进制代码吗?怎么是MIPS汇编语言?对,就是汇编语言,这个汇编语言中的每一条指令就对应一条二进制代码,汇编的方式更容易让人理解。

现在我们得到了计算机可以理解的MIPS指令(可以想象成可执行程序)了,接下来的问题是如何执行MIPS指令。

要执行程序,首先必须将可执行程序文件(从外设)加载到内存。可执行文件加载到内存时,操作系统会为每个可执行程序在内存中分配四个区:

  • 1 代码区。也就是前面的到的汇编代码所对应的二进制码
  • 2 全局数据区。全局变量,静态变量放在这个区
  • 3 堆区。表示在程序执行过程中,动态申请的空间在这个区,如C语言中的malloc, free操作均是针对此区中的对象执行申请或释放操作
  • 4 栈区。函数运行时,局部变量的保存区域。

我们重点关注代码区和栈区,初始时,其分布如下图所示:

代码区-1.png

其中PC(Program Counter)是程序计数器(是CPU中的一个寄存器,具有数据存储功能),即用来指示下一个即将执行的指令的地址,本例中,进入main函数后,即将执行的第一条指令是a = 3,其地址为:0X FF FF FF 00, 因此PC指向其对应的汇编代码的地址。

CPU根据PC的的值,从指定地址0X FF FF FF 00处获取指令,然后解析指令,并执行指令(即执行a=3)。

当a = 0执行完毕后,PC执行操作:PC = PC + 4,PC指向0X FF FF FF 04,即b = 5的指令的地址。此时,栈区的状态为: 
栈区-1.png

接着,CPU根据PC的的值,从指定地址0X FF FF FF 04处获取指令,然后解析指令,并执行指令(即执行b=5)。当b=5执行完毕后,PC执行操作:PC = PC + 4,PC指向0X FF FF FF 08,即sum=a+b的指令的地址。此时,栈区的状态为:

栈区-2.png

然后,CPU根据PC的的值,从指定地址0X FF FF FF 08处获取指令,然后解析指令,并执行指令(即执行sum=a+b)。当sum=a+b执行完毕后,PC执行操作:PC = PC + 4,PC指向0X FF FF FF 12(因为,指令已经执行完毕,这里应该提示要从main函数返回)。此时,栈区的状态为: 
栈区-3.png

至此为止,main函数内部的流程基本上陈述完了(关于函数间调用,相对复杂,计算机组成中会详细讲解),但如何实现这些步骤呢,其中的关键问题包括如下:


问题:

    • 知道内存地址,如何定位到那个地址???答案:地址译码器
    • 获取到a=3对应的指令后,如何知道是做a=0+3的操作???答案:解析指令,指令译码器
    • PC寄存器如何保存值?如何做加4操作?答案:计数器(寄存器讲解) 

转载于:https://www.cnblogs.com/Ph-one/p/7691612.html

相关文章:

  • 4.2说说计算机中的异常
  • 并发编程的几种形式
  • 【传感器】BMA253 数字,三轴加速度传感器
  • 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现...
  • c语言的按位运算符
  • 汇编语言如何取段地址的
  • 二路归并排序算法
  • 什么是MSB/LSB码?
  • 平衡二叉树(AVL树)
  • 二叉排序树(查询、插入、删除)
  • 数据结构中的堆和操作系统里的堆不一样为什么都叫堆呢?
  • 关于Simplicity Studio使用math.h编译出错
  • 正态分布(Normal distribution)又名高斯分布(Gaussian distribution)
  • MLP(多层神经网络)介绍
  • ring0
  • 「面试题」如何实现一个圣杯布局?
  • 07.Android之多媒体问题
  • Android系统模拟器绘制实现概述
  • CSS魔法堂:Absolute Positioning就这个样
  • C语言笔记(第一章:C语言编程)
  • dva中组件的懒加载
  • iOS 颜色设置看我就够了
  • Sass 快速入门教程
  • Spring框架之我见(三)——IOC、AOP
  • Twitter赢在开放,三年创造奇迹
  • Vue实战(四)登录/注册页的实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 利用DataURL技术在网页上显示图片
  • 入手阿里云新服务器的部署NODE
  • 使用 QuickBI 搭建酷炫可视化分析
  • 手机端车牌号码键盘的vue组件
  • FaaS 的简单实践
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #Java第九次作业--输入输出流和文件操作
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (13)Hive调优——动态分区导致的小文件问题
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (八十八)VFL语言初步 - 实现布局
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (多级缓存)缓存同步
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET CLR基本术语
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net refrector
  • .NET简谈设计模式之(单件模式)
  • .Net中ListT 泛型转成DataTable、DataSet
  • @Autowired自动装配
  • [.net] 如何在mail的加入正文显示图片
  • [100天算法】-二叉树剪枝(day 48)