summaryrefslogtreecommitdiff
path: root/projects/04/mult/Mult.asm
blob: f84ce79a1f1d45d2cc71c06626c685fc663280d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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