From Nand to Tetris week 4
这次回顾第四章的内容,这部分主要介绍了机器语言。
课程官网:
视频地址:
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指令的作用如下:
- 提供唯一将常数输入计算机的方法。
- 通过将目标内存数据单元的地址放入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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere