程序和指令
上个笔记我们已经基本做出了一个简单的CPU,这次我们给CPU一些指令来运行。
我们可以把0010 1110替换成“LOAD_A 14”指令,这样更好理解,我们对内存里剩下的数也这样转换。
“LOAD_A 14”是从地址14中拿到数字3,放入寄存器A
“LOAD_A 15”是从地址15中拿到数字14,放入寄存器B
“ADD B A”告诉ALU,把寄存器B和寄存器A里的数字加起来,B和A的顺序很重要,因为结果会存在第二个寄存器。
“STORE_A 13”把寄存器A的值存入内存地址13。
我们加一些指令
- SUB是减法,和add一样需要2个寄存器来操作
- JUMP让程序跳转到新位置,如果想改变指令顺序,或跳过一些指令,这个很实用。例如,JUMP 0可以跳回开头,JUMP在底层的实现方式是把指令后4位代表的内存地址的值覆盖掉“指令地址寄存器”里的值。
- JUMP_NEGATIVE,它只在ALU的“负数标志”为真时,进行JUMP
之前的笔记中讲过,算数结果为负,“负数标志”才是真。结果不是负数时,“负数标志”为假。
- HALT指令让计算机的指令停止运行。
所以之前的例子程序,应该有HALT,
否则跑完STORE_A 13之后,CPU会不停运行下去,处理后面的0,因为0不是操作码,所以电脑会崩掉。
指令和数据都是存在同一内存里的,它们都是二进制数,没有区别,所以HALT很重要,能区分指令和数据。
运行这个程序,程序将不会结束,因为到达不了HALT,原因是ADDRESS 4 的位置上有JUMP 2。
为了停下来,我们需要有条件的JUMP,只有特定条件满足了,才执行JUMP,比如JUMP NEGATIVE就是条件跳转的一个例子。还有其他类型的条件跳转,比如JUMP IF EQUAL(如果相等),JUMP IF GREATER(如果更大)
这个就可以,当循环运行到B-A的值也就是ALU的计算结果为负时,JUMP_NEG 5指令会将指令跳转到ADDRESS 5,之后会遇到HALT。上面这个程序,有7个指令,但CPU执行了13个指令,因为在内部循环了2次。这个代码其实是算余数的,11除5余1。如果加多几行指令,我们还可以跟踪循环了多少次,11除以5,循环2次,余1