summaryrefslogtreecommitdiff
path: root/projects/04/mult/Mult.asm
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2022-08-16 11:54:23 +0800
committerFrederick Yin <fkfd@fkfd.me>2022-08-16 11:54:23 +0800
commit9542deeb483a00b6fabed7574720926ce97d7511 (patch)
tree0f2c1f72c03dd4693fd59df67544d2a4dddc5494 /projects/04/mult/Mult.asm
parent9c0cb1d1c32724fc95ac9548e4f8d873d3adaccc (diff)
Projects, 01-06 completed
Diffstat (limited to 'projects/04/mult/Mult.asm')
-rw-r--r--projects/04/mult/Mult.asm53
1 files changed, 53 insertions, 0 deletions
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