视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W4U4.7 - Hack Programming part 2
根据老师的规划,Hack编程2,本节主要讲三个编程会遇到的情况。
Branching - 条件判断跳转
Variables - 变量
Iteration -循环判断
一、Branching - 条件判断跳转
如下图一汇编代码实例,有负责判断的(图中红色部分):
//下面指令用来判断跳转的
@8 //第2条指令
D;JGT //第3条指令
解释:经过下图第0和第1条指令,D已经是R0的值了。如果D大于0。就跳转到A存的地址。(A在第2条指令已经赋值为8)
有负责结束的(图中红色部分):
//上节课提到了,不明白返回复习下吧
@10 //可以看出,有效代码有10行
0;JMP
解释:无条件跳到第10行代码。
汇编程序 红色高亮了 判断跳转的部分 这样我们才能清晰的看出结构但如果 没有这些红色高亮呢,又没有开始几行的注释提示。
感觉这几行程序还是挺难看懂的。
下图 右边 的 Donald Knuth 就说了,写代码不能这样滴,代码不光机器能运行,最主要的得让人能看懂。
Donald Knuth 是《The Art of Computer Programming》一书的作者,这部作品是他的终生工作,共有四卷。第一卷于 1968 年出版由此老师又引出另一个东西,来解决上面可读性不高的问题。
符号引用 (symbolic references)
下图中红色 POSITIVE 就是一个 符号(课程里叫LABEL)。它有点像虚拟寄存器的“别名”,但“别名”是Hack 汇编程序的编译器规定的(例如R0-R15、SCREEN、KEYBOARD等)。而 符号引用 是 写程序的人自己起的名字,你也可以写成ALIBABA。
//声明(定义):
(ALIBABA)
//使用:
@ALIBABA
作用:
很直观的能看出 判断语句之后会跳转到那里。
声明时, 加上(),例如图中 POSITIVE 声明时,指代的是它下一行指令的“门牌号”,例子中就是 8 。
使用时, 加上@,就相当于 @8。
图中还有一个 END 符号引用,同理。所以如下图:
事实上 当 汇编器 在把 汇编语言 翻译 成 0101xxx 之前。是会先把这些 符号引用 转成最开始不易读懂的样子,如下图右侧,然后再翻译成0101xxx。
因为第六周会实际来制作 汇编器,所以到时候这一部分 预处理问题 也会提及。
感觉第六周有很多坑需要填。。。
二、Variables - 变量
如下图:一个R1 与 R2 交换数据的操作。
写过代码的话,最简单的办法,就是找个中间变量帮助一下。
理论上,我觉得这个中间变量也可以用上节课提到的,虚拟寄存器。不过考虑到它们都有名字,可能有特殊作用。
所以老师这里来介绍 一种 自定义的 变量。
如下图直接使用
//自定义变量
@temp
//temp是自己随便起的名字,也可以是@alibaba
同理,在编译器,在翻译成0101xxx前,会预处理这个 temp。
编译器,会从RAM第16个寄存器开始找,如果发现空闲的寄存器。就给temp转成对应的“门牌号”。例如图里就是16。
为什么是16号开始,我估计前16个保留给 虚拟寄存器用了。
这样写除了可读性提高了。事实上还能帮助语言在跨计算机设备时。不依赖寄存器地址。而是可以由一个加载器(loader)来自动分配完成。
我估计还是第六周 做 汇编器 时,会详细提及加载器(loader)
在高级语言,变量有各种类型,但是在Hack小电脑里,那变量只有一种类型。就是16位的0101xxx。
三、Iteration - 循环判断
假设有一个需求,要做从1加到n (1+2+3+4+5+6+ 。。。+n)
实现这个需求,基本上会用到本节之前所学的。(判断跳转,变量)
老师建议在此暂停一下,用上面学的到技能,琢磨琢磨怎么写。
当然答案就在 下图右侧,能看懂也不错。
因为汇编语言毕竟还是不容易看懂。且容易出错。
所以最后老师提供了一个最佳实践的方法。
先写一个 伪代码 (Pseudo code),如下图左下角黄色。
然后逐句再翻译 写成 汇编语言。
最后测试。
本节讲了 判断跳转、变量、以及如何用它们写 循环判断。
下节课 讲解 指针 和 输入输出。
网友评论