From Nand to Tetris week 4

这次回顾第四章的内容,这部分主要介绍了机器语言。

课程官网:

https://www.nand2tetris.org/

视频地址:

https://www.coursera.org/learn/build-a-computer

Chapter 4 机器语言

Part 1:课程回顾

机器语言

冯诺依曼式计算机的架构如下:

内存部分分为指令和数据,这部分都是二进制数,指令部分称为机器语言。显然直接编写机器语言非常麻烦,所以人们想到了使用助记符,例如:

助记符更进一步即发展为汇编语言

Hack机器语言

概述

Hack是一个基于冯诺依曼架构的16位计算机,由一个CPU,指令内存和数据内存以及两个内存映射I/O设备(显示器和键盘组成)。这里有一点非常关键,就是Hack将指令内存和数据内存分开(这称为哈佛式计算机结构),而一般计算机中并不是如此,除此之外,两个内存区都是16-位宽,有15位地址空间。

寄存器

使用时有两个称为D和A的16位寄存器,这两个寄存器能够被算数和逻辑指令显式控制,例如A=D-1或D!=A。注意D仅用来存储数据值,A既可以作为数据寄存器也可以作为地址寄存器。注意因为Hack的指令为16-位宽,而地址需要15位,所以无法将操作码和地址放在同一条指令里,因此Hack语法规定内存的存取指令总是对隐式的内存地址“M”进制操作,例如如下例子:

1
2
3
4
5
6
7
8
9
10
// RAM[17]=10
@10
D=A
@17
M=D
// RAM[5] = RAM[3]
@3
D=M
@5
M=D
A指令

A指令的形式如下:

上述指令将计算机中特点的值存储到A寄存器中去,A指令的作用如下:

  1. 提供唯一将常数输入计算机的方法。
  2. 通过将目标内存数据单元的地址放入A寄存器,来为将对该内存单元进行操作的C指令提供必要的条件。
C指令

C指令的形式如下:

每个位的具体含义可以参考课本,这里从略。

Hack编程

这部分课程中介绍的比较详细,这里举一个例子作为回顾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Computes: if R0>0
// R1=1
// else
// R1=0
// Usage: put a value in RAM[0],
// run and inspect RAM[1].

@R0
D=M // D = RAM[0]
@8
D;JGT // If R0>0 goto 8
@R1
M=0 // RAM[1]=0
@10
0;JMP // goto end
@R1
M=1 // R1=1
@10
0;JMP

Part 2:项目

Mult

这部分编写乘法,只要进行循环即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@R2
M=0 //sum=0
@3
M=1 //i=1
(LOOP)
@3
D=M
@R1
D=D-M
@END
D;JGT //judge

@R2
D=M
@R0
D=D+M //sum += R0
@R2
M=D
@3
M=M+1
@LOOP
0;JMP

(END)
@END
0;JMP

Fill

这部分实现将屏幕变成黑色的程序,注意屏幕的像素数量为

所以每次要迭代8192次。程序中有两个循环,第一个循环保证程序持续运行,第二个循环用来填充屏幕:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

@i
M=1
@8192
D=A
@n
M=D //迭代总数8192
@color //初始化颜色
M=0

(LOOP1)
@SCREEN
D=A
@addr
M=D // addr = 16384
@i
M=1 //i=1
@color
M=0

@KBD
D=M //获取键盘
@BLACK //如果键盘有输入,则将颜色变为黑色
D;JGT

(LOOP2) //循环填充屏幕
@i
D=M
@n
D=D-M
@LOOP1 //i>n goto LOOP1
D;JGT

@color
D=M //获得颜色

@addr
A=M
M=D //RAM[addr]=D

@i
M=M+1
@addr
M=M+1
@LOOP2
0;JMP

(BLACK)
@color
M=-1
@LOOP2
0;JMP

本文标题:From Nand to Tetris week 4

文章作者:Doraemonzzz

发布时间:2019年05月19日 - 19:28:00

最后更新:2019年05月19日 - 19:38:50

原始链接:http://doraemonzzz.com/2019/05/19/From Nand to Tetris week 4/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。