zoukankan      html  css  js  c++  java
  • 编码:隐匿在计算机软硬件背后的语言(8)--自动操作(三)

    上一篇文章中,我们修改了指令格式,一个指令为三个字节,通过这种方式我们可以自由访问RAM阵列中的地址,使得取数据以及对数据运算更加灵活。但是上文中的组织结构仍然存在不足。比如我们要进行乘法运算,例如A7h×1Ch,乘法实际上由加法运算得到结果。也就是1Ch个A7h进行累加的结果。如果用上面的结构,我们需要先写一个A7h×1的加法实现,如下图所示



    如上图所示进行完一次加法之后,我们还有写(1Ch-1)次相同的指令,也就是在重复27次相同操作,或者在上图的0012h处添加一条Halt指令,然后按27次复位(计数器回到0000h处开始执行)。无论哪一种方法都需要重复相同的运算。除了重复以外,我们还会消耗很多的存储空间,如果相乘的两个数很大时,存储空间还可能不足。另一方面,如果其他存储空间存放着重要的数据,这种方式有可能会覆盖掉其他地址的数据。所以目前的这些指令不足以完成我们的工作。于是我们需要另外一种指令。

    基于以上的问题,我们增加了一条跳转(jump)指令。如图所示


    代码为30h。jump指令通过作用于16位计数器(地址)实现。jump也占三个字节,后两个字节存储要跳转到的地址。当遇到jump指令时。计数器就会输出jump指令代码后的16位地址。这个我们通过下面的D型边沿触发器(包含预置和清零)电路来实现。


    左边上面的输入为数据位,下面为时钟;中间上面为置位,下面为清零;右边上面为输出,下面为输出的非。当置位为1时,输出Q为1;当清零为1时,输出Q为0,置位和清零不允许同时为1。如果想加载一个新的值(1位),可以像下图一样组织


    当置位为0时,无论A为什么值,置位输入(D触发器中上端口)为0,清零段只受复位控制;

    当置位为1时,如果A为1,则置位段为1,输出为1,如果A为0,则清零输入为1,输出为0;也就是当置位为1时,输出与A相同。这样我们就实现了加载A的功能。对于16位计数器,我们需要16个上图一样的电路来控制。当需要跳转时,使置位为1,同时使16位计时器的输入为16位锁存器(此时存储jump指令后两个字节的地址)的输出,这样就可以实现跳转。电路图如下所示,


    锁存器的输出作为16为计数器的输入和2-1选择器的输入,当需要跳转时,16为计数器置位为1,这样其输入就是jump指令后的地址,也就是锁存器的输出;需要访问某个地址时,RAM地址输入选择2-1选择器的锁存器连接端的信号。这样就实现了地址的自由访问。

    这样我们的确实现了跳转,但是还有一个问题,这个跳转如何停止?

    目前来说,这个跳转无法停止,乘法(累加)将无休止的进行下去。所以我们的跳转需要是条件跳转(Conditional jump)。我们需要下图的结构来实现条件跳转。


    左边用一个或非门来接收加法器的输出,这样,当加法器的输出全部为0时,零标志位才会输出1。有了条件跳转之后我们增加4条指令,如下图所示


    同时halt指令码该为FFh,这样可以控制跳转条件。这里用到了非零跳转,下面会说明。

    下图是0012h地址之后的指令图


    上图执行完一次后,就会完成A7h×1的运算,此时同时把0013h处的数也就是累加的次数1Ch同001Eh处的数(也就是halt)相加,相加后结果是001Bh,累加次数减一,然后加001Bh存回到0013h,接下跳转到0000h处进行下一次累加。在进行27次之后,0013h地址处的值是1,它与FFh相加后得到0,此时零标志位为1。不再跳转,运算结束。

    到目前为止,我们的这个组织结构可以称为计算机了,当然它还很原始。

    能否控制循环(重复操作)是计算机和计算器的区别。一台数字计算机主要由4部分组成:处理器、存储器以及至少一个输入设备和一个输出设备。我们设计的计算机中,存储器就是64KRAM阵列,输入设备是开关,输出设备是灯泡。其余的部分都可以视为处理器,这个处理器是8位的。输入到存储器中的数值和指令等数据被称作软件,相比于硬件,软件更容易修改。

    一直以来,我们用数值或者英文短语来表示机器执行的指令,通常机器码都分配了对应的助记符。我们上面提到的命令对应的助记符如下图所示


    有了助记符,类似于“把1003h地址处的字节加载到累加器”就可以简洁地表示为

    LOD A, [1003h]

    A代表累加器,A和 [1003h]都是LOD指令的操作数,[]表示加载到累加器的是 1003h地址中存储的字节而非1003h。有了助记符,上面的乘法就可以表示为如下形式


    在编码时最好不要用实际的数字地址,因为他们是可变的,用标号来指代存储器中的地址空间是个较好的方法

    采用标号,上述计算过程又变为



    上面就是汇编语言,还可以用中文添加注释,在需要添加注释的行后用分后即可。

    到这里为止,我们就回顾了计算器和计算机的形成过程,当然现在的计算机更加发达。

  • 相关阅读:
    Codeforces Round #613 选讲
    Codeforces Round #612 选讲
    Codeforces917E
    一道题20
    LOJ#2244. 「NOI2014」起床困难综合症
    求欧拉回路
    *LOJ#2134. 「NOI2015」小园丁与老司机
    vim操作命令
    常见问题解决
    CentOS7下如何修改mysql的数据目录
  • 原文地址:https://www.cnblogs.com/hitfredrick/p/6403000.html
Copyright © 2011-2022 走看看