From Nand To Tetris 从与非门到俄罗斯方块

28、P1 W4 U4.7 HACK编程2

2019-08-09  本文已影响0人  shazizm

视频:
如果本次课程对应的 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),如下图左下角黄色。
然后逐句再翻译 写成 汇编语言。
最后测试。

本节讲了 判断跳转、变量、以及如何用它们写 循环判断。
下节课 讲解 指针 和 输入输出。







Donald Knuth 给年轻人的建议:不要相信热门的东西就是好东西。我更愿意选择另一条路。假如许多人趋附于某一个想法,我会觉得这个想法很可能是错的。 假如我的作品一下子火了,我很可能认为我需要改变了。这听起来很荒唐。 但是我已经看到了这事情的另一面,很多人常常违背自己的兴趣追逐于某件事情,仅仅是因为这件事情是社会或者很多人都追捧它。而这些违背自己兴趣去寻求热门方向的人,会觉得这样子能给他们带来更多的名利,所以才去追求那些热门的技术或事情。但是,假如你坚持你的想法是重要的,那么从长远的看,这很有可能就是对的,而且会是真正有益于世界的。追随你自己的选择,而不是追逐你道听途说的。
上一篇下一篇

猜你喜欢

热点阅读