Nand2Tetris——project04

一、前言

项目来源:

该项目是著名课程Nand2Tetris的课程项目,总共分12部分,从零开始构建属于自己的hack计算机。该文项目属于第四个子项目。

项目路线介绍:

在硬件部分,你将进入 01 的世界,用与非门构造出逻辑电路,并逐步搭建出一个 CPU 来运行一套课程作者定义的简易汇编代码。在软件部分,你将编写一个编译器,将作者开发的一个名为Jack的高级语言编译为可以运行在虚拟机上的字节码,然后进一步翻译为汇编代码。你还将开发一个简易的 OS,让你的计算机支持输入输出图形界面。至此,你可以用 Jack 开发一个俄罗斯方块的小游戏,将它编译为汇编代码,运行在你用与非门搭建出的 CPU 上,通过你开发的 OS 进行交互。

二、项目介绍

目标:

  • 乘法程序:该程序的输入值存储在R0和R1中。程序计算R0*R1的值并将其存入R2。
  • I/O处理程序:这个程序是个无限循环程序,它侦测键盘的输入。类似于一个根植于键盘上的监视器,监视所有的键,一有键按下就会把屏幕变黑。你可以以任何空间顺序来选择屏幕的变黑和清屏,只要连续地按一个键足够长时间,屏幕就会全黑,长时间不按键就会清屏。
    要求:使用本章介绍的Hack——一门简单的类汇编语言,来完成对以上两个程序的编写
    细节:
  1. 完成该项目的关键在于对Hack语言的学习,而用Hack编写程序要注意的就是抓住D、M、A这三个操作对象,特别是A命令,而另外一点就是循环结构了,把握好循环结构就能很快完成该项目
  2. 在Hack里面没有*符合,那自然是如无必要,勿增实体。我们可以使用累加的方式实现乘法
  3. 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
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值