28、P1 W4 U4.7 HACK编程2

作者: shazizm | 来源:发表于2019-08-09 21:44 被阅读0次

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

    相关文章

      网友评论

        本文标题:28、P1 W4 U4.7 HACK编程2

        本文链接:https://www.haomeiwen.com/subject/jfuhjctx.html