0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CPU是如何识别代码的呢?

电子工程师笔记 来源:电子工程师笔记 2023-05-08 10:48 次阅读

最近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU对代码的识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们。

首先要开始这个话题要先说一下半导体。啥叫半导体?半导体其实就是介于导体和绝缘体中间的一种东西,比如2二极管

af64574c-ec30-11ed-90ce-dac502259ad0.jpg

电流可以从A端流向C端,但反过来则不行。你可以把它理解成一种防止电流逆流的东西。

当C端10V,A端0V,二极管可以视为断开。

当C端0V,A端10V,二极管可以视为导线,结果就是A端的电流源源不断的流向C端,导致最后的结果就是A端=C端=10V

等等,不是说好的C端0V,A端10V么?咋就变成结果是A端=C端=10V了?

你可以把这个理解成初始状态,当最后稳定下来之后就会变成A端=C端=10V。

如果你不能理解的话就记住这种情况下它相当于导线就行了。利用半导体,我们可以制作一些有趣的电路,比如【与门】。

af6df806-ec30-11ed-90ce-dac502259ad0.jpg

此时A端B端只要有一个是0V,那Y端就会和0V地方直接导通,导致Y端也变成0V。只有AB两端都是10V,Y和AB之间才没有电流流动,Y端也才是10V。

我们把这个装置成为【与门】,把有电压的地方计为1,0电压的地方计为0。至于具体几V电压,那不重要。也就是AB必须同时输入1,输出端Y才是1;AB有一个是0,输出端Y就是0。其他还有【或门】【非门】和【异或门】,跟这个都差不多,或门就是输入有一个是1输出就是1,输入00则输入0。

非门也好理解,就是输入1输出0,输入0输出1。异或门难理解一些,输入01或者10则输出1,输入00或者11则输出0。(即输入两个一样的值则输出0,输入两个不一样的值则输出1)。

这几种门都可以用二极管做出来,具体怎么做就不演示了,有兴趣的童鞋可以自己试试。我们把门电路简化成下面几个符号。

af82801e-ec30-11ed-90ce-dac502259ad0.jpg

然后我们就可以用门电路来做CPU了。当然做CPU还是挺难的,我们先从简单的开始:加法器。

加法器顾名思义,就是一种用来算加法的电路,最简单的就是下面这种。

af957dea-ec30-11ed-90ce-dac502259ad0.jpg

AB只能输入0或者1,也就是这个加法器能算0+0,1+0或者1+1。输出端S是结果,而C则代表是不是发生进位了,二进制1+1=10嘛。这个时候C=1,S=0费了大半天的力气,算个1+1是不是特别有成就感?那再进一步算个1+2吧(二进制01+10),然后我们就发现了一个新的问题:第二位需要处理第一位有可能进位的问题,所以我们还得设计一个全加法器。

afa4deb6-ec30-11ed-90ce-dac502259ad0.jpg

我们简化一下!

afcd7c36-ec30-11ed-90ce-dac502259ad0.jpg

也就是有3个输入2个输出,分别输入要相加的两个数和上一位的进位,然后输入结果和是否进位。然后我们把这个全加法器串起来。

afd60e5a-ec30-11ed-90ce-dac502259ad0.jpg

我们就有了一个4位加法器,可以计算4位数的加法也就是15+15。

做完加法器我们再做个乘法器吧,当然乘任意10进制数是有点麻烦的,我们先做个乘2的吧。乘2就很简单了,对于一个2进制数数我们在后面加个0就算是乘2了比如:

5=101(2)10=1010(2)

所以我们只要把输入都往前移动一位,再在最低位上补个零就算是乘2了。那乘3呢?简单,先位移一次(乘2)再加一次。乘5呢?先位移两次(乘4)再加一次。所以一般简单的CPU是没有乘法的,而乘法则是通过位移和加算的组合来通过软件来实现的。

现在假设你有8位加法器了,也有一个位移1位的模块了。串起来你就能算了!

(A+B)X2

激动人心,已经差不多到了准小学生水平。那我要是想算呢?

AX2+B

简单,你把加法器模块和位移模块的接线改一下就行了,改成输入A先过位移模块,再进加法器就可以了。

早期的计算机就是这样编程的,几分钟就算完了但插线好几天。而且插线是个细致且需要耐心的工作,所以我们需要改进一下,让CPU可以根据指令来相加或者乘2。

这里再引入两个模块,一个叫flip-flop,简称FF,中文叫触发器。

aff240c0-ec30-11ed-90ce-dac502259ad0.jpg

这个模块的作用是存储1bit数据。比如上面这个RS型的FF,R是Reset,输入1则清零。S是Set,输入1则保存1。RS都输入0的时候,会一直输出刚才保存的内容。

我们用FF来保存计算的中间数据(也可以是中间状态或者别的什么),1bit肯定是不够的,不过我们可以并联嘛,用4个或者8个来保存4位或者8位数据。这种我们称之为寄存器(Register)。另外一个叫MUX,中文叫选择器。

b00705d2-ec30-11ed-90ce-dac502259ad0.png

这个就简单了,sel输入0则输出i0的数据,i0是什么就输出什么,01皆可。同理sel如果输入1则输出i1的数据。当然选择器可以做的很长,比如这种四进一出的。

b0197622-ec30-11ed-90ce-dac502259ad0.jpg

有这个东西我们就可以给加法器和乘2模块(位移)设计一个激活针脚。这个激活针脚输入1则激活这个模块,输入0则不激活。这样我们就可以控制数据是流入加法器还是位移模块了。于是我们给CPU先设计8个输入针脚,4位指令,4位数据。我们再设计3个指令:

0100,数据读入寄存器0001,数据与寄存器相加,结果保存到寄存器0010,寄存器数据向左位移一位(乘2)

为什么这么设计呢,我们可以为每个模块设计一个激活针脚。然后我们可以分别用指令输入的第二第三第四个针脚连接寄存器,加法器和位移器的激活针脚。

这样我们输入0100这个指令的时候,寄存器输入被激活,其他模块都是0没有激活,数据就存入寄存器了。同理,如果我们输入0001这个指令,则加法器开始工作,我们就可以执行相加这个操作了。这里就可以简单回答这个问题的第一个小问题了:

那cpu 是为什么能看懂这些二级制的数呢?

为什么CPU能看懂,因为CPU里面的线就是这么接的。你输入一个二进制数,就像开关一样激活CPU里面若干个指定的模块以及改变这些模块的连同方式,最终得出结果。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二极管
    +关注

    关注

    147

    文章

    9568

    浏览量

    165798
  • 半导体
    +关注

    关注

    334

    文章

    26987

    浏览量

    215981
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211086
  • 加法器
    +关注

    关注

    6

    文章

    183

    浏览量

    30087
  • 二级制
    +关注

    关注

    0

    文章

    2

    浏览量

    5853

原文标题:CPU 是如何识别代码的呢?

文章出处:【微信号:电子工程师笔记,微信公众号:电子工程师笔记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    und异常和cpu异步模式代码cpu无法识别

    中断都没有问题,问题出现在und异常和cpu异步模式代码!!! 当代码运行至这里时,就是设置cpu处于异步模式的代码,由于其机器码为0xee
    发表于 04-17 04:51

    CPU到底是怎么识别代码的?

    最低位上补个零就算是乘2了。具体逻辑电路图我就不画,你们知道咋回事就行了。那乘3?简单,先位移一次(乘2)再加一次。乘5?先位移两次(乘4)再加一次。所以一般简单的CPU是没有乘法的,而乘法则是通过
    发表于 08-18 10:55

    剖析CPU代码识别和读取

    最近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU代码识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们。首先要开始这个话题要先说一下半导体。啥叫半导体?半导体其实
    发表于 06-08 06:30

    如何在串口波特率识别里提升i.MXRT代码的执行性能

    怎样去识别SBL项目里ISP串口的高波特率?如何在串口波特率识别里提升i.MXRT代码的执行性能
    发表于 11-09 07:48

    如何识别cpu芯片

    如何识别cpu芯片 如今CPU市场新品迭出,要在型号众多的处理器中找到合适的产品,清楚了解CPU的内“芯”就显得很重要了。下面笔者就以Intel最新
    发表于 02-24 13:37 2929次阅读

    指纹识别matlab源代码

    指纹识别matlab源代码,利用matlab实现指纹识别的算法
    发表于 01-20 15:53 86次下载

    cpu16_verilog源代码

    cpu16_verilog源代码分享,下来看看。
    发表于 05-24 09:45 27次下载

    CPU是如何识别代码

    近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU代码识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们。
    的头像 发表于 04-12 10:28 3615次阅读
    <b class='flag-5'>CPU</b>是如何<b class='flag-5'>识别</b><b class='flag-5'>代码</b>的

    CPU具体主要显示了哪些代码

    printf或其它类似的打印显示工具估计是最灵活最简单的调试工具。打印代码执行过程中的各种变量可以让你知道代码执行的情况。但是,printf对正常的代码执行干扰比较大(一般printf占用CP
    的头像 发表于 06-18 15:56 2957次阅读

    如何写出让CPU执行更快的代码

    转自:小林coding 前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重
    的头像 发表于 10-29 11:21 2321次阅读
    如何写出让<b class='flag-5'>CPU</b>执行更快的<b class='flag-5'>代码</b>?

    CPU为什么不做成圆形

    当然也有长方形的版本。上表面平整光滑,下表面则有着金属触点或针脚。虽然我们默认CPU的形状为矩形,但是不知道有没有小伙伴想过CPU为什么不做成圆形
    的头像 发表于 11-10 17:30 1886次阅读

    单片机是如何识别程序代码的?

    最近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU代码识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们。
    发表于 02-08 16:54 2次下载
    单片机是如何<b class='flag-5'>识别</b>程序<b class='flag-5'>代码</b>的?

    基于python代码的人脸识别实例

    基于python代码的一个人脸识别的实例,完整的实例,本人在pycharm中实测通过,是一个很基础的入门级的人脸检测和识别
    发表于 07-18 11:11 13次下载

    射频识别技术漫谈(27)——CPU卡概述

    射频识别技术漫谈(27)——CPU卡概述
    的头像 发表于 10-24 16:15 1711次阅读
    射频<b class='flag-5'>识别</b>技术漫谈(27)——<b class='flag-5'>CPU</b>卡概述

    CPU怎么访问代码和数据

    程序经过编译后,变成了可执行的文件,可执行文件主要包括代码和数据两部分,代码是只读的,数据则是可读可写的。 可执行文件由操作系统加载到内存中,交由CPU去执行,现在问题来了,CPU怎么
    的头像 发表于 11-08 17:04 835次阅读
    <b class='flag-5'>CPU</b>怎么访问<b class='flag-5'>代码</b>和数据