From 9542deeb483a00b6fabed7574720926ce97d7511 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Tue, 16 Aug 2022 11:54:23 +0800 Subject: Projects, 01-06 completed --- projects/04/mult/Mult.asm | 53 +++++++++++++++++++++++++++++++++ projects/04/mult/Mult.cmp | 7 +++++ projects/04/mult/Mult.out | 7 +++++ projects/04/mult/Mult.tst | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 projects/04/mult/Mult.asm create mode 100644 projects/04/mult/Mult.cmp create mode 100644 projects/04/mult/Mult.out create mode 100644 projects/04/mult/Mult.tst (limited to 'projects/04/mult') diff --git a/projects/04/mult/Mult.asm b/projects/04/mult/Mult.asm new file mode 100644 index 0000000..f84ce79 --- /dev/null +++ b/projects/04/mult/Mult.asm @@ -0,0 +1,53 @@ +// 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.) +// +// This program only needs to handle arguments that satisfy +// R0 >= 0, R1 >= 0, and R0*R1 < 32768. + +// Put your code here. +@acc +M=0 // acc = 0 + +@R0 +D=M +@a +M=D // a = RAM[0] +@WRITE +D;JEQ // if (a == 0) goto WRITE + +@R1 +D=M +@b +M=D // b = RAM[1] +@WRITE +D;JEQ // if (b == 0) goto WRITE + +(LOOP) + @b + D=M + @acc + M=M+D // acc += b + @a + M=M-1 // a-- + D=M + @WRITE + D;JEQ // if (a == 0) goto WRITE + @LOOP + 0;JMP // goto LOOP + +(WRITE) + @acc + D=M + @R2 + M=D // RAM[2] = acc + @END + 0;JMP // goto END + +(END) + @END + 0;JMP diff --git a/projects/04/mult/Mult.cmp b/projects/04/mult/Mult.cmp new file mode 100644 index 0000000..296b5fb --- /dev/null +++ b/projects/04/mult/Mult.cmp @@ -0,0 +1,7 @@ +| RAM[0] | RAM[1] | RAM[2] | +| 0 | 0 | 0 | +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 3 | 1 | 3 | +| 2 | 4 | 8 | +| 6 | 7 | 42 | \ No newline at end of file diff --git a/projects/04/mult/Mult.out b/projects/04/mult/Mult.out new file mode 100644 index 0000000..e31b5df --- /dev/null +++ b/projects/04/mult/Mult.out @@ -0,0 +1,7 @@ +| RAM[0] | RAM[1] | RAM[2] | +| 0 | 0 | 0 | +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 3 | 1 | 3 | +| 2 | 4 | 8 | +| 6 | 7 | 42 | diff --git a/projects/04/mult/Mult.tst b/projects/04/mult/Mult.tst new file mode 100644 index 0000000..9bf4fa8 --- /dev/null +++ b/projects/04/mult/Mult.tst @@ -0,0 +1,74 @@ +// 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/Mult.tst + +load Mult.asm, +output-file Mult.out, +compare-to Mult.cmp, +output-list RAM[0]%D2.6.2 RAM[1]%D2.6.2 RAM[2]%D2.6.2; + +set RAM[0] 0, // Set test arguments +set RAM[1] 0, +set RAM[2] -1; // Test that program initialized product to 0 +repeat 20 { + ticktock; +} +set RAM[0] 0, // Restore arguments in case program used them as loop counter +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 1, // Set test arguments +set RAM[1] 0, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 50 { + ticktock; +} +set RAM[0] 1, // Restore arguments in case program used them as loop counter +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 0, // Set test arguments +set RAM[1] 2, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 80 { + ticktock; +} +set RAM[0] 0, // Restore arguments in case program used them as loop counter +set RAM[1] 2, +output; + +set PC 0, +set RAM[0] 3, // Set test arguments +set RAM[1] 1, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 120 { + ticktock; +} +set RAM[0] 3, // Restore arguments in case program used them as loop counter +set RAM[1] 1, +output; + +set PC 0, +set RAM[0] 2, // Set test arguments +set RAM[1] 4, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 150 { + ticktock; +} +set RAM[0] 2, // Restore arguments in case program used them as loop counter +set RAM[1] 4, +output; + +set PC 0, +set RAM[0] 6, // Set test arguments +set RAM[1] 7, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 210 { + ticktock; +} +set RAM[0] 6, // Restore arguments in case program used them as loop counter +set RAM[1] 7, +output; -- cgit v1.2.3