上一篇: CPU怎么去执行程序的?—(计算机基础课十八)
上周我们把 ALU, 控制单元, RAM, 时钟 结合在一起,做了个基本,但可用的"中央处理单元", 简称 CPU。它是计算机的核心,我们已经用电路做了很多组件。
这次我们给 CPU 一些指令来运行。
CPU 之所以强大,是因为它是可编程的 -如果写入不同指令,就会执行不同任务,CPU 是一块硬件,可以被软件控制!
LOAD指令
我们重新看一下上周的简单程序,内存里有这些值,每个地址可以存 8 位数据。因为我们的 CPU 是假设的,这里前4位是"操作码",后4位指定一个内存地址或寄存。内存地址 0 是 0010 1110,前4位代表 LOAD_A 指令,意思是:把后 4 位指定的内存地址的值,放入寄存器 A,后 4 位是 1110,十进制的 14。
我们来把 0010 1110 看成 "LOAD_A 14" 指令,这样更好理解!也更方便说清楚,可以对内存里剩下的数也这样转换。这里,我们的程序只有4个指令,还有数字 3 和 14。
现在一步步看,"LOAD_A 14" 是从地址 14 中拿到数字3,放入寄存器A。"LOAD_B 15" 是从地址 15 中拿到数字14,放入寄存器B。
ADD指令
"ADD B A" 告诉 ALU 把寄存器 B 和寄存器 A 里的数字加起来,(B和A的)顺序很重要,因为结果会存在第二个寄存器,也就是寄存器 A。
最后一条指令是 "STORE_A 13",把寄存器 A 的值存入内存地址 13,我们把 2 个数加在了一起了。
毕竟只有4个指令,也只能做这个了。加多一些指令吧。SUB 是减法,和 ADD 一样也要 2 个寄存器来操作。
JUMP指令
还有 JUMP(跳转),让程序跳转到新位置。如果想改变指令顺序,或跳过一些指令,这个很实用。举例, JUMP 0 可以跳回开头,JUMP 在底层的实现方式是, 把指令后 4 位代表的内存地址的值,覆盖掉 "指令地址寄存器" 里的值。
JUMP_NEGATIVE
还有一个特别版的 JUMP 叫 JUMP_NEGATIVE,它只在 ALU 的 "负数标志" 为真时,进行 JUMP。前面讲过,算数结果为负,"负数标志"才是真,结果不是负数时,"负数标志"为假,如果是假,JUMP_NEGATIVE 就不会执行, 程序照常进行。我们之前的例子程序,其实应该是这样,才能正确工作 。否则跑完 STORE_A 13 之后,CPU 会不停运行下去,处理后面的 0,因为 0 不是操作码,所以电脑会崩掉!
我还想指出一点,指令和数据都是存在同一个内存里的。它们在根本层面上毫无区别,都是二进制数。HALT 很重要,能区分指令和数据。
好,现在用 JUMP 让程序更有趣一些,我们下节继续,用JUMP
相关阅读: