一、前言
项目来源:
该项目是著名课程Nand2Tetris的课程项目,总共分12部分,从零开始构建属于自己的hack计算机。该文项目属于第四个子项目。
项目路线介绍:
在硬件部分,你将进入 01 的世界,用与非门构造出逻辑电路,并逐步搭建出一个 CPU 来运行一套课程作者定义的简易汇编代码。在软件部分,你将编写一个编译器,将作者开发的一个名为Jack的高级语言编译为可以运行在虚拟机上的字节码,然后进一步翻译为汇编代码。你还将开发一个简易的 OS,让你的计算机支持输入输出图形界面。至此,你可以用 Jack 开发一个俄罗斯方块的小游戏,将它编译为汇编代码,运行在你用与非门搭建出的 CPU 上,通过你开发的 OS 进行交互。
二、项目介绍
目标:
- 乘法程序:该程序的输入值存储在R0和R1中。程序计算R0*R1的值并将其存入R2。
- I/O处理程序:这个程序是个无限循环程序,它侦测键盘的输入。类似于一个根植于键盘上的监视器,监视所有的键,一有键按下就会把屏幕变黑。你可以以任何空间顺序来选择屏幕的变黑和清屏,只要连续地按一个键足够长时间,屏幕就会全黑,长时间不按键就会清屏。
要求:使用本章介绍的Hack——一门简单的类汇编语言,来完成对以上两个程序的编写
细节:
- 完成该项目的关键在于对Hack语言的学习,而用Hack编写程序要注意的就是抓住D、M、A这三个操作对象,特别是A命令,而另外一点就是循环结构了,把握好循环结构就能很快完成该项目
- 在Hack里面没有
*
符合,那自然是如无必要,勿增实体。我们可以使用累加的方式实现乘法 - I/O处理程序说是处理屏幕上的像素,但是实际上是对屏幕到内存上的映射空间进行写处理,不停止地对键盘的映射空间进行判定,判定不为空则对整块屏幕进行渲染
三、项目展示
1.ASM文件图
2.实现代码
2.1.mult.asm
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/Mult.asm
// Multiplies R0 and R1 and stores the result in R2.
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
// Put your code here.
// Function:R[2] = R[1]*R[0];
@i
M=1 //i=1
@sum
M=0 //sum=0
(LOOP)
@i
D=M
@R0
D=D-M
@OUTLOOP
D;JGT //if i>R0 goto OUTLOOP
@sum
D=M
@R1
D=D+M
@sum
M=D //sum=sum+R1
@i
M=M+1
@LOOP
0;JMP
(OUTLOOP)
@sum
D=M
@R2
M=D
(END)
@END
0;JMP
2.2.fill.asm
// This file is part of www.nand2tetris.org
// and the book "The Elements of Computing Systems"
// by Nisan and Schocken, MIT Press.
// File name: projects/04/Fill.asm
// Runs an infinite loop that listens to the keyboard input.
// When a key is pressed (any key), the program blackens the screen,
// i.e. writes "black" in every pixel;
// the screen should remain fully black as long as the key is pressed.
// When no key is pressed, the program clears the screen, i.e. writes
// "white" in every pixel;
// the screen should remain fully clear as long as no key is pressed.
// Put your code here.
(BEGIN)
@newaddres
M=0
@SCREEN
D=A
@arr
M=D
@n
M=0
@i
M=0
@KBD
D=M
@LOOP
D;JEQ
@n
M=-1
(LOOP)
@8192
D=A
@i
D=D-M
@END
D;JEQ
@i
D=M
@arr
D=M+D
@newaddress
M=D
@n
D=M
@newaddress
A=M
M=D
@i
M=M+1
@LOOP
0;JMP
(END)
@BEGIN
0;JMP