23、P1 W4 U4.2 机器语言 基本概念
视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W4U4.2 - Machine Languages-Elements
在开始 讲 Hack小电脑 的 机器语言前,老师要先讲讲通用的基本概念。
因为不光Hack小电脑的设计原则是这样,事实上大部分计算机的设计都符合这些基本概念。
理解这些不光帮助我们在之后更好的制作Hack小电脑,也能举一反三的理解其它计算机的架构设计。
机器语言 是神秘的 软件 和 硬件的交汇点,初高中时,第一次接触电脑,特别好奇就是这里。
(其实在第二周U2.4 ALU的那节课已经隐约能体会到)
接下来说说下图里的三问,也是本节要说明的基本概念。
1.操作指令都是什么?
2.这些指令怎么操作数据?
3.如何控制指令执行顺序?

1.操作指令都是什么?
机器语言 的各种操作,实际上往往都对应着硬件的实现。
操作基本分三种:
算术操作:加、减。有的还有乘、除。等等
逻辑操作:与、或、非等等
指令顺序控制:跳转、判断等等。
有区别的地方,比如乘除的实现,HACK电脑就没有乘除的硬件实现,而是之后在Part2软件部分去实现的。
另外数据类型,有的有浮点数,有的数据位更宽(64位)或者更短(8位)。

2.这些指令怎么操作数据?
在说如何操作数据前,先说一下数据是如何在存储里读取的。
事实上访问这些存储是相对消耗资源的。
需要提供一个长长的地址来对应存储。
把存储的数据放入CPU也要花费一定时间。
为了解决访问速度和存储量的扩大间的冲突。
解决办法:把存储分层级来区分。(如下图)
离CPU最近的是很少的寄存器(Register,物理上,在CPU内部),也是读取速度是最快的。
然后下一级可能是Cache(可以对应理解为电脑CPU上的一级缓存,二级缓存?),存储单元就多了些,同时访问速度也相对离CPU最近的Register慢了一些。
然后是主存储(Main Memory,可以对应理解为电脑里的内存条?),同理存储比Cache大,速度就再慢了一些。
最后是Disk(对应理解为硬盘就好了)。

下面主要说一下寄存器
寄存器主要分两种:(如下图)
一种数据寄存器(Data Registers):存的就是数据,例如 R1、R2
一种地址寄存器(Address Registers):存的是其它寄存器的地址,例如 A

现在知道了上图两种寄存器,那么回到问题2(2.这些指令怎么操作数据?)
如下图,四种操作数据的方式:
数据寄存器 操作,比如
Add R1,R2
解释:R1 + R2 再存到 R2
直接寻址 操作,比如
Add R1,M[200]
解释:R1 + 门牌号为200的寄存器里的数值,结果再存入200号寄存器
地址寄存器 间接寻址 操作,比如
Add R1,@A
解释:R1 + 门牌号为地址寄存器里存的地址数值,结果再存回去。区别上面的就是,200不是直接给出的。而是需要从A里的地址所指的寄存器里取出。
立即数 操作,比如
Add 73,R1
解释:73 + R1,在存回R1。区别第一种,就是不用变量名R1、R2。直接就是一个数值。

这里顺带提了一下 外围设备 (输入输出设备,例如 显示器,键盘,等等)的访问。
实际上也是存储器的访问。利用了一种 存储映射方式(memory mapping)。
这里就不说泛泛概念了,后面U4.5课程有详细说明。

3.如何控制指令执行顺序?
最后一个基本概念,就是对程序顺序的控制。
默认CPU是顺序执行程序的。
但有时需要特殊控制一下,例如跳回前一步执行,以实现循环执行的目的。
这里涉及两种控制:
1.无条件跳转
2.有条件跳转
如下图 先说 无条件跳转
无条件跳转 也是一个指令,例如,让CPU执行的下一步 跳(jump) 到 第2行,那么命令就是 “jump 第二行”,但我们很难知道第二行命令指令的具体在存储中的地址,所以为了简化方便,程序也会提供一些功能来标识第二行的位置。例如下图 loop,这样命令就变成 “jump loop”(不用记这些命令,只是示意)

如下图 再说 有条件跳转
注:JGT(J = Jump = 跳、GT = Greater Than = 大于)
JGT R1,0,cont
解释:如果R1 大于 0 跳到 cont。否则,顺序执行下一行。

这节讲解完了 通用计算机的 机器语言的 通用基本概念。
下面几节,开始来看看我们要实现的Hack小电脑里的机器语言具体是什么样子的。