软件和硬件的关系-机器码怎么转成电路状态并执行的

一、概述

        机器语言是整个计算机体系中意义最深奥的接口-------它是硬件和软件相接的中间线。借由机器语言,程序员用符号指令表达的抽象思维被转换成执行在硅片上的物理操作,因此,既可以将机器语言看作编程工具,也可以将其看作硬件平台内部不可分割的一部分。

        存储程序的基本思想其实相当简单。计算机基于固定的硬件平台,能够执行固定的指令集。同时,这些指令能够被当成构建模块,组成任意的程序。

在计算机操作的每一步,CPU从指令中取出一个字,对其进行解码,从而执行指定的指令,然后计算下一条将要执行的指令。

        上一讲我们讲了底层逻辑计算和存储的实现原理,芯片的底层原理_u013978512的博客-CSDN博客。

 

        这一讲,我们讲下程序是怎么被自动执行的(主要关注原理)。

 二、原理

        指令的内容是一串二进制数字的机器码,每条指令都有对应的机器码,CPU 通过解析机器码来知道指令的内容。不同的 CPU 有不同的指令集,也就是对应着不同的汇编语言和不同的机器码。

        下面以一个demo为例,对原理进行一个解释。

         假设上面有这样几个指令,每一个指令由8位组成,前四位是操作码,后四位代表地址或寄存器。那么机器在执行的过程中,是按照 取指令-》解码-》执行  的步骤进行的。每一步我们拆解来看。

2.1 取指令阶段

        如上的一段程序,指令地址寄存器会从某个地址开始,根据时钟不断递增。假设目前指令地址寄存器的值是0,这时候0地址的内存被选中,其内容传输到指令寄存器(参考上一讲,地址和read enable线同时打开,就可以读取到锁存器中的值)。 

2.2 解码阶段

         0地址的代码00101110被读到指令寄存器中后,由于指令集约定好的,就是前四位是操作码,所以该指令的操作码是0010。

        0010会激活某个电路,这个电路的输出就是1,通过查操作码和指令集的关系表可以看到这个电路当然就是LOAD_A指令对应的电路。不同的操作码会激活不同的电路。所以说指令集和硬件有密不可分的关系,这里就可以窥知一二。 

2.3 执行阶段

         LOAD_A电路的输出连上了内存的read enable线和寄存器A的write enable线。同时指令还有后四位,作为地址选中了某个内存单元,这里1110就是内存地址为14的内存单元。这样,就会把地址为14的内存单元的数据传输到了寄存器A。

         LOAD_A指令我们就分析完了,其他的指令也是一样的原理。所以工程师为了避免陷入无尽的细节中,就进行了抽象,把上面几个阶段涉及的电路抽象为控制单元。

        第一条指令把地址14中的值传给了寄存器A,以此类推,第二条指令是把地址15中的值传给寄存器B,第三条指令代表将寄存器A的值和寄存器B的值做加和,加法器的原理可参考前一篇文章。这就是程序、指令集和硬件的关系。

三、结论

        所谓“指令”,其实就是“某个命令码“(一般叫机器码),这个”命令码”会改变CPU内部一堆“开关”的状态,以激活不同的电路;然后数据利用类似的机制,被送入这个被“指令”激活的电路。当数据(某种高低电平的组合)经过这些电路后,就会变成另外一组高低电平的组合:这个组合刚好和“指令”代表的功能所应该给出的结果一致。

        有人说,我们输入的01010之类的机器码,怎么变成机器的高低电平的?其实,你所看到的0101的数字,只是幻象,只是为了人们好观察而已,其实自始至终都是高低电平的状态在改变。假设把你面前的显示器给扔了,你仍按照相同的姿势敲键盘,你就意识到键盘的敲击就是产生了一系列的高低电平的信息,这些数据会存在内存中。而给你配一个显示器,仅仅是为了把高低电平映射出来让你看到而已。

         简而言之,代码在计算机内部,本身就是一组特定的高低电平组合;而计算机是精心设计的、海量的、用高低电平控制通断的开关组;当给这个开关组输入不同的电平组合时,就会导致它内部出现复杂的开关动作,最终产生另外一组高低电平的组合作为输出;这些开关动作经过精心设计,使得它的行为是可解释、可预测的——解释/预测的规则,就是CPU的指令集。

参考:

1. 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值