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

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

3天内不再提示

该怎样去编写CPU指令呢?过程是怎样的

冬至配饺子 来源:天奇工作室 作者:LRC 2022-08-08 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

计算机是用来做什么的?顾名思义用来计算的。不过在现代的计算机应用中,计算不是计算机主要工作内容(这个是后话)。

要计算我们就需要计算电路。计算电路有很多比如加法电路,减法电路,当然还有乘法除法等等。这些电路都是建立在与或非门的基础之上的,这个在前面的章节有讲解过。向这些电路输入运算的数值,我们就能在输出端很快(需要时间)得到我们想要的结果。但在计算之前计算机需要知道我们要做什么运算,用哪两个数字做运算。

pYYBAGLwr0-AOhHLAABb2VGetl4355.png

通过DMX和MUX选取对应的运算电路

所以我们需要通过输入相应的指令来通知计算机。我们都知道计算机内部处理的都是0和1的电压信号,所以我们给计算机的指令也得是0和1。假设我们规定加法是000,减法是001,乘法是010,除法是011,当然还有100、101等等别的运算。如此输入计算机内,那么计算机就能够区分我们要做哪些运算了。还记得MUX和DMX吗?就是用这个部件来区分的。只能够区分哪些运算还不够,还得知道是哪些数。那也很简单,我们把要输入的数字和指令一起给计算机,比如11111(加数一) 00000(加数二) 000(加法),它的意思就是把11111和00000(二进制数)加起来。当然你也可以把000放到最前面,只要你的计算机能理解就行。

那么我们得出答案了,这个结果是11111(显而易见),这个数字会出现在加法器末端。那我想接着把这个数字乘二要怎么办呢?你当然可以再输11111 00001 010,这样就可以把11111乘2了。但是能不能更快一点呢?比如直接调用加法器结果11111?我们这里就需要用到寄存器来暂时存住数据。寄存器原理我们在之前的章节也曾讲过。我们现在设置32个寄存器分别命名为00000、00001……11111。


poYBAGLwr26AaijUAABqCKFS5gc590.png

左:通过MUX选择要运算的寄存器

右:通过DMX选择要写回的寄存器

我们重写之前的加法命令,现在可以是11111 00000 000 00000(寄存器编号)。意思是把11111和00000相加,结果放到00000寄存器里。那么我们接下来想把相加后的结果乘二,指令是不是就可以这样写:00000 10 010 00001 ?你应该懂得意思是把00000寄存器里的数字和10相乘,把积放到00001寄存器里。但是计算机不懂得,而你也只是结合了上下文才能如此理解。我同样可以把这个指令认为是00和10相乘,把积放到01寄存器里。再者,我们输入进计算机的数字是连续的,之间才不会有这么有爱的空格,这就出现歧义了。怎么处理这个问题呢?也很简单。我们规定一下,这种直接写入在指令的运算的数字我们称之为立即数,这种立即数的长度必须是5位,因为如果不是和寄存器序号一样是五位的话,计算机设计起来比较麻烦。我们只约定了长度还不够,你还得告诉我这个五位数字是立即数还是寄存器序号。所以我们要再给指令加长两位。如果是前一个五位数是立即数,那么第一个标志位是1。第二个同理。所以上面的这个乘二指令可以这样写了:00000 00010 010 0000101(指示第二个五位数是立即数)。

还没结束,一般我们进行计算机编程的时候,代码最好是干练的,这样运行效率才最高。所以像第一个例子中的两个立即数相加的情况是很少出现的,因为没什么必要,程序员完全可以直接把两个数字的和直接写进程序中,不会让计算机每次运行程序时为此再重算一遍。况且这种两数相加完全可以通过两次使用立即数的方法得到。所以我们可以把上述乘2指令简化成00010 00000 010 00001 1。可以看到,前面两个五位数字调换了顺序,最后面的标志位变成了一位,其原因就是现在只会由第一个五位数字来充当立即数,而第二个永远是寄存器数字。有人会问,这样有什么好处吗?有的,指令少了一位。意味着十条指令少了十位,以前内存可是按位卖的……所以在能满足需求的情况下,要尽可能的短。但是这样也有弊病。

这样还不够,有人认为立即数就五位够什么用?这样的立即数太小了。那我们把立即数扩充到十二位,范式是000000000000 00000 000 00000 0,我们把第一个五位数扩充到了十二位。那计算机每次遇到指令的时候就先看一下最后的标准位,判断这条指令是立即数指令还是寄存器指令。如果是立即数指令,那就用得到十二位全部的数据,如果是寄存器指令,那就直接取最后五位数据,并对前面七位数字不作理会。有人有疑惑:不对啊,你前面刚说内存按位来卖,指令大小应该越少越好。那立即数指令长就长点,寄存器指令保持原长不好吗,这样不是很省内存空间吗?有道理,所以这种变长(长度变化)指令是之前的x86的做法。可是时代变了,今昔不同往日,内存早已不是按位来卖的,这点空间浪费问题不大,定长指令是现在的主流。(注意,定长指令并不是极其严格的长度一致。64位的计算机可以执行32位指令甚至16位指令,为的是软件的兼容性)更重要的是,这让硬件解码的工作来得轻松的多。并且想象一下,计算机指令是头尾相连在一起的,如果指令长度不一样,你甚至不知道第一个指令有多长,还得疯狂断句才能读懂(文言文即视感)。

今天应该算是把指令编写思路大致给讲清楚了,我们下次具体看看risc-v指令集,即人家是怎么设计CPU指令的,和我今天讲的有什么不同,以及如何在硬件中实现解码指令。



审核编辑:刘清

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

    关注

    31

    文章

    5589

    浏览量

    129064
  • 运算电路
    +关注

    关注

    8

    文章

    117

    浏览量

    27445
  • 计算机
    +关注

    关注

    19

    文章

    7764

    浏览量

    92682
  • DMX
    DMX
    +关注

    关注

    0

    文章

    10

    浏览量

    9125
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    系统调用和API有什么区别

    的,原因就在于系统调用和普通的API调用不太一样,哪里不一样? 相信大家都去银行柜台办理过业务,想一想为什么会有一道玻璃把你和工作人员隔离开来?为什么不直接让你自己金库里取钱
    发表于 12-03 06:52

    NICE指令的完整执行过程

    NICE指令的完整执行过程如下: 1、主处理器的译码单元提供EXU级译码得到指令的操作码,以判断其是否属于默认的自定义指令组。 如果
    发表于 10-23 07:25

    怎样检测蓄电池性能

    类型是铅酸蓄电池,这类电池属于二次电池,广泛应用于汽车、摩托车等交通工具中。那么再使用蓄电池的过程中,怎样判断它的性能?其中最直接的方式是通过检查电压和启动时的
    的头像 发表于 09-08 08:40 504次阅读
    <b class='flag-5'>怎样</b>检测蓄电池性能

    怎样使用Jlink (SEGGER) 通过SWD读写

    怎样使用Jlink (SEGGER) 通过SWD读写?Jlink没有找到CYPD6125的信号,官方也没有找到CYPD6125对应的FLM和xml 文件
    发表于 05-27 06:45

    CPU的各种指令和执行流程

    在集成电路设计中,CPU指令是指计算机中央处理单元(CPU)用来执行计算任务的基本操作指令集。这些指令
    的头像 发表于 04-18 11:24 1922次阅读

    dlpc3433怎样修改固件会将开机时显示的为无启动画面且为外部输入模式

    怎样修改固件会将开机时显示的为无启动画面且为外部输入模式?或者说有什么工具可以修改
    发表于 02-27 06:08

    Linux环境下的软件包下载指令是什么

    在windows的env中可以直接使用pkgs —update下载软件包,Linux环境下这个指令好像不生效,那么Linux环境下的软件包下载指令是什么
    发表于 02-19 07:34

    vsp01m01是怎样来控制CCD的白平衡?

    您好!我想请问一下,vsp01m01这颗AD芯片是怎样来控制CCD的白平衡?我看数据手册,只有0x6,0x7寄存器控制数字增益,这里的增益是指图像的总增益么?那如果我要单独控制R或G或B分量的增益,如何实现
    发表于 02-12 08:06

    噪声与ADC的范围和位数是什么关系怎样选用和匹配?

    以上三者是什么关系怎样选用和匹配?ADC的动态输入范围一般都有多大的?谢谢
    发表于 02-08 07:14

    hyper-v 备份,hyper-v怎样进行虚拟机的创建

    虚拟机技术打破了传统计算机的限制,为我们带来了全新的计算机模式。今天给大家介绍hyper-v怎样进行虚拟机的创建?    hyper-v怎样进行虚拟机的创建?    使用PowerShell启用,以
    的头像 发表于 02-05 14:54 797次阅读
    hyper-v 备份,hyper-v<b class='flag-5'>怎样</b>进行虚拟机的创建

    ldc1000使用的具体时序是怎样

    ldc1000 evm,测得它的波形均是在上跳变接收数据和发送数据,这与ldc1000的芯片手册中的时序图不同,想问下您ldc1000的使用的具体时序是怎样? 2.我最开始是使用pic16f887
    发表于 01-13 07:59

    使用RDATAC指令后,ADS131E04传送的数据格式以及内容是怎样的?

    请问使用RDATAC指令后,ADS131E04传送的数据格式以及内容是怎样的,数据手册是按照ADS131E08为例来说明有27个BYTE,不知道ADS131E04是不是只用15个BYTE?
    发表于 01-10 07:19

    AD2S1203在输出的18位中应该怎样选取其中的16位输出

    =64,则输出的数据N=18位,那么问题来了,在输出的18位中应该怎样选取其中的16位输出?如果M=128,则N=21位,那么在这21位中怎样选16位
    发表于 01-08 08:15

    多片ADS1675输出数据的顺序是怎样

    interface,我想问下怎么配置CS管脚可以使多片ADS1675共用serial inteface ,同时,serial interface 指的 是什么,是SCLK管脚、DRDY管脚、DOUT管脚这三对管脚对吗?如果DOUT管脚对共用,那多片ADS1675输出数据的顺序是怎样
    发表于 12-13 08:59

    ADS1281怎样评判采集到的结果是否准确?

    各位专家我按照ADS1281做了一个转换板,目前也能采集到电压,但是不知道怎样评判采集到的结果是否准确,请问各位专家怎样判定我的板子是否达到了ADS1281这个芯片标称的性能
    发表于 12-11 07:17