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

课程官网:

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”进制操作,例如如下例子:

// 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编程

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

// 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

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

@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次。程序中有两个循环,第一个循环保证程序持续运行,第二个循环用来填充屏幕:


@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