计算机速成课学习6

第六章 指令和程序


前言

前边的学习完成了基本的中央处理单元,也就是CPU,硬件已经完成的差不多了,今天要学习一下,更多的指令和程序具体是如何在CPU中进行运转的。

一、指令介绍

之前处理的指令,主要是四种,将数据存入寄存器A,将数据存入寄存器B,把寄存器A的数据写入RAM,将两个寄存器的数据相加存入寄存器A/B。
在这里插入图片描述

这次再多加几种。

1. SUB

字面意思去理解,就是减法,与ADD指令相似,用前位的寄存器数据减去后位的寄存器数据,并将数据放入后位寄存器中。

2.JUMP

跳转指令,根据后四位的数据将指令跳转至目标位置,也就是将后四位的数据计算覆盖指令地址寄存器,并调整指令寄存器。

3.JUMP_NEG

条件跳转,如果ALU计算结果是负的时候发生跳转。

4.HALT

计算机不能无止境的一直走,我们的程序也总有尽头,在程序的尽头我们就需要一个HALT程序来完成整个程序的终结。(ps:跑超了但是该地址为空程序就会发生崩溃)

二、指令使用实例

在这里插入图片描述
来看看这个程序。
0 LOAD_A 14 将地址14处的数据放入寄存器A
1 LOAD_B 15 将地址15的数据放入寄存器B
2 ADD B A 将寄存器B的数据和寄存器A的数据相加并把和的数据放入A
3 STORE_A 13 将寄存器A的数据放入地址13
4 JUMP 2 将指令跳转至2
5 HALT 程序停止
程序似乎很简单,在程序执行到4时,会跳转至2,说出现实意义就是,寄存器A的数据会在每次循环都加1,似乎完成了一些比较厉害的功能,没错没错,就是循环!但问题是,这个程序似乎没办法停下来。

那要怎么继续完成呢,设置一个阈值,也就是设定一个条件,让我们再写一个数据,完成循环且可以及时停止。

在这里插入图片描述
0 LOAD_A 14 将地址14处的数据放入寄存器A
1 LOAD_B 15 将地址15的数据放入寄存器B
2 SUB B A 计算寄存器A的值减去寄存器B的值,并将差值放入寄存器A
3 JUMP_NEG 5 如果ALU结果为负,则跳转至5
4 JUMP 2 跳转至2
5 ADD B A 将寄存器B的数据和寄存器A的数据相加并把和的数据放入A
6 STORE_A 13 将寄存器A的数据放入地址13
7 HALT 程序停止
这次的结果好多了,寄存器A的值不停的减1,直至寄存器A的值为负,则跳转至5,完成剩下的步骤,结束。

三、 指令长度局限性及解决方案

对于四位的操作符数据位来说,只有16种操作符,但实际上为了方便程序的运行,我们需要更多的操作符,最简单的方法就是增加操作符表示位数,比如用32位或者64位来表示操作符,或者更多,这就是"指令长度"。
上述表示的方法是其中一种方法。

另外一种方法叫做,“可变长度指令”。
这个理解起来稍微有一些复杂,目前见到的指令模式一般是操作符+操作地址/操作值,也就是我们通过操作符以及后边的操作值就可以执行指令,这样的操作值就叫做立即值。包括HALT,JUMP,我们可以直接完成指令,而不用继续读取操作值后边的数据再判断执行什么指令。
我的理解就是这种方法下,是通过程序的方式完成指令,也就是说,复杂的指令是由简单的指令拼接而成,不止需要读取一个操作符,需要完整的跑完一小段程序,才算完成了这个操作指令,这样也就符合了可变的含义。

总之这里我可能也不是很清楚,后续会再研究研究,或者大家有什么想法可以说出来,让我再学习一下。


总结

今天的学习完毕,刚开始感觉挺简单的,到了指令这里突然就抽象起来了,我们所学习的只是最基础的情况,实际的CPU执行确实会复杂很多,学无止境,继续加油。

  • 41
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值