Add solutions for part 1
This commit is contained in:
106
projects/08/FunctionCalls/StaticsTest/Class1.asm
Normal file
106
projects/08/FunctionCalls/StaticsTest/Class1.asm
Normal file
@@ -0,0 +1,106 @@
|
||||
// Unsupported Function
|
||||
|
||||
// push argument 0
|
||||
@0
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class1.0
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class1.0
|
||||
M = D
|
||||
// ^ Class1.0 = D
|
||||
|
||||
// push argument 1
|
||||
@1
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class1.1
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class1.1
|
||||
M = D
|
||||
// ^ Class1.1 = D
|
||||
|
||||
// push constant 0
|
||||
@0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// Unsupported Return
|
||||
|
||||
// Unsupported Function
|
||||
|
||||
// push static Class1.0
|
||||
@Class1.0
|
||||
D = M
|
||||
// ^ D = Class1.0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// push static Class1.1
|
||||
@Class1.1
|
||||
D = M
|
||||
// ^ D = Class1.1
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// sub
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
A = A - 1
|
||||
D = M
|
||||
A = A + 1
|
||||
D = D - M
|
||||
A = A - 1
|
||||
M = D
|
||||
@SP
|
||||
M = M - 1
|
||||
|
||||
// Unsupported Return
|
||||
|
||||
20
projects/08/FunctionCalls/StaticsTest/Class1.vm
Normal file
20
projects/08/FunctionCalls/StaticsTest/Class1.vm
Normal file
@@ -0,0 +1,20 @@
|
||||
// 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/08/FunctionCalls/StaticsTest/Class1.vm
|
||||
|
||||
// Stores two supplied arguments in static[0] and static[1].
|
||||
function Class1.set 0
|
||||
push argument 0
|
||||
pop static 0
|
||||
push argument 1
|
||||
pop static 1
|
||||
push constant 0
|
||||
return
|
||||
|
||||
// Returns static[0] - static[1].
|
||||
function Class1.get 0
|
||||
push static 0
|
||||
push static 1
|
||||
sub
|
||||
return
|
||||
106
projects/08/FunctionCalls/StaticsTest/Class2.asm
Normal file
106
projects/08/FunctionCalls/StaticsTest/Class2.asm
Normal file
@@ -0,0 +1,106 @@
|
||||
// Unsupported Function
|
||||
|
||||
// push argument 0
|
||||
@0
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class2.0
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class2.0
|
||||
M = D
|
||||
// ^ Class2.0 = D
|
||||
|
||||
// push argument 1
|
||||
@1
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class2.1
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class2.1
|
||||
M = D
|
||||
// ^ Class2.1 = D
|
||||
|
||||
// push constant 0
|
||||
@0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// Unsupported Return
|
||||
|
||||
// Unsupported Function
|
||||
|
||||
// push static Class2.0
|
||||
@Class2.0
|
||||
D = M
|
||||
// ^ D = Class2.0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// push static Class2.1
|
||||
@Class2.1
|
||||
D = M
|
||||
// ^ D = Class2.1
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// sub
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
A = A - 1
|
||||
D = M
|
||||
A = A + 1
|
||||
D = D - M
|
||||
A = A - 1
|
||||
M = D
|
||||
@SP
|
||||
M = M - 1
|
||||
|
||||
// Unsupported Return
|
||||
|
||||
20
projects/08/FunctionCalls/StaticsTest/Class2.vm
Normal file
20
projects/08/FunctionCalls/StaticsTest/Class2.vm
Normal file
@@ -0,0 +1,20 @@
|
||||
// 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/08/FunctionCalls/StaticsTest/Class2.vm
|
||||
|
||||
// Stores two supplied arguments in static[0] and static[1].
|
||||
function Class2.set 0
|
||||
push argument 0
|
||||
pop static 0
|
||||
push argument 1
|
||||
pop static 1
|
||||
push constant 0
|
||||
return
|
||||
|
||||
// Returns static[0] - static[1].
|
||||
function Class2.get 0
|
||||
push static 0
|
||||
push static 1
|
||||
sub
|
||||
return
|
||||
897
projects/08/FunctionCalls/StaticsTest/StaticsTest.asm
Normal file
897
projects/08/FunctionCalls/StaticsTest/StaticsTest.asm
Normal file
@@ -0,0 +1,897 @@
|
||||
// Bootstrap code
|
||||
@256
|
||||
D = A
|
||||
@SP
|
||||
M = D
|
||||
// ^ SP = 256
|
||||
|
||||
// call Sys.init 0
|
||||
@Sys.init:return:0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push return-address
|
||||
@LCL
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push lcl
|
||||
@ARG
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push arg
|
||||
@THIS
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push this
|
||||
@THAT
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push that
|
||||
@SP
|
||||
D = M
|
||||
@0
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 0 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Sys.init
|
||||
0;JMP
|
||||
// ^ goto Sys.init
|
||||
(Sys.init:return:0)
|
||||
|
||||
|
||||
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Sys.vm
|
||||
|
||||
// function Sys.init 0
|
||||
(Sys.init)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push constant 6
|
||||
@6
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// push constant 8
|
||||
@8
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// call Class1.set 2
|
||||
@Class1.set:return:1
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push return-address
|
||||
@LCL
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push lcl
|
||||
@ARG
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push arg
|
||||
@THIS
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push this
|
||||
@THAT
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push that
|
||||
@SP
|
||||
D = M
|
||||
@2
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 2 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Class1.set
|
||||
0;JMP
|
||||
// ^ goto Class1.set
|
||||
(Class1.set:return:1)
|
||||
|
||||
|
||||
// pop temp 0
|
||||
@0
|
||||
D = A
|
||||
@5
|
||||
A = D + A
|
||||
D = A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = temp + index
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@R13
|
||||
A = M
|
||||
M = D
|
||||
// ^ *R13 = D
|
||||
|
||||
// push constant 23
|
||||
@23
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// push constant 15
|
||||
@15
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// call Class2.set 2
|
||||
@Class2.set:return:2
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push return-address
|
||||
@LCL
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push lcl
|
||||
@ARG
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push arg
|
||||
@THIS
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push this
|
||||
@THAT
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push that
|
||||
@SP
|
||||
D = M
|
||||
@2
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 2 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Class2.set
|
||||
0;JMP
|
||||
// ^ goto Class2.set
|
||||
(Class2.set:return:2)
|
||||
|
||||
|
||||
// pop temp 0
|
||||
@0
|
||||
D = A
|
||||
@5
|
||||
A = D + A
|
||||
D = A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = temp + index
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@R13
|
||||
A = M
|
||||
M = D
|
||||
// ^ *R13 = D
|
||||
|
||||
// call Class1.get 0
|
||||
@Class1.get:return:3
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push return-address
|
||||
@LCL
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push lcl
|
||||
@ARG
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push arg
|
||||
@THIS
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push this
|
||||
@THAT
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push that
|
||||
@SP
|
||||
D = M
|
||||
@0
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 0 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Class1.get
|
||||
0;JMP
|
||||
// ^ goto Class1.get
|
||||
(Class1.get:return:3)
|
||||
|
||||
|
||||
// call Class2.get 0
|
||||
@Class2.get:return:4
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push return-address
|
||||
@LCL
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push lcl
|
||||
@ARG
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push arg
|
||||
@THIS
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push this
|
||||
@THAT
|
||||
D = M
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push that
|
||||
@SP
|
||||
D = M
|
||||
@0
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 0 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Class2.get
|
||||
0;JMP
|
||||
// ^ goto Class2.get
|
||||
(Class2.get:return:4)
|
||||
|
||||
|
||||
// label Sys.init:WHILE
|
||||
(Sys.init:WHILE)
|
||||
|
||||
// goto Sys.init:WHILE
|
||||
@Sys.init:WHILE
|
||||
0;JMP
|
||||
|
||||
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Class1.vm
|
||||
|
||||
// function Class1.set 0
|
||||
(Class1.set)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push argument 0
|
||||
@0
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(ARG + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class1.0
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class1.0
|
||||
M = D
|
||||
// ^ Class1.0 = D
|
||||
|
||||
// push argument 1
|
||||
@1
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(ARG + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class1.1
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class1.1
|
||||
M = D
|
||||
// ^ Class1.1 = D
|
||||
|
||||
// push constant 0
|
||||
@0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// return
|
||||
@LCL
|
||||
D = M
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = FRAME = LCL
|
||||
@5
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@R14
|
||||
M = D
|
||||
// ^ R14 = RET = *(FRAME - 5)
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@ARG
|
||||
A = M
|
||||
M = D
|
||||
// ^ POP into *ARG
|
||||
@ARG
|
||||
D = M + 1
|
||||
@SP
|
||||
M = D
|
||||
// ^ SP = ARG + 1
|
||||
@1
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THAT
|
||||
M = D
|
||||
// ^ THAT = *(FRAME - 1)
|
||||
@2
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THIS
|
||||
M = D
|
||||
// ^ THIS = *(FRAME - 2)
|
||||
@3
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = *(FRAME - 3)
|
||||
@4
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = *(FRAME - 4)
|
||||
@R14
|
||||
A = M
|
||||
0;JMP
|
||||
// ^ goto RET
|
||||
|
||||
|
||||
// function Class1.get 0
|
||||
(Class1.get)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push static Class1.0
|
||||
@Class1.0
|
||||
D = M
|
||||
// ^ D = Class1.0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// push static Class1.1
|
||||
@Class1.1
|
||||
D = M
|
||||
// ^ D = Class1.1
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// sub
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
A = A - 1
|
||||
D = M
|
||||
A = A + 1
|
||||
D = D - M
|
||||
A = A - 1
|
||||
M = D
|
||||
@SP
|
||||
M = M - 1
|
||||
|
||||
// return
|
||||
@LCL
|
||||
D = M
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = FRAME = LCL
|
||||
@5
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@R14
|
||||
M = D
|
||||
// ^ R14 = RET = *(FRAME - 5)
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@ARG
|
||||
A = M
|
||||
M = D
|
||||
// ^ POP into *ARG
|
||||
@ARG
|
||||
D = M + 1
|
||||
@SP
|
||||
M = D
|
||||
// ^ SP = ARG + 1
|
||||
@1
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THAT
|
||||
M = D
|
||||
// ^ THAT = *(FRAME - 1)
|
||||
@2
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THIS
|
||||
M = D
|
||||
// ^ THIS = *(FRAME - 2)
|
||||
@3
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = *(FRAME - 3)
|
||||
@4
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = *(FRAME - 4)
|
||||
@R14
|
||||
A = M
|
||||
0;JMP
|
||||
// ^ goto RET
|
||||
|
||||
|
||||
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Class2.vm
|
||||
|
||||
// function Class2.set 0
|
||||
(Class2.set)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push argument 0
|
||||
@0
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(ARG + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class2.0
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class2.0
|
||||
M = D
|
||||
// ^ Class2.0 = D
|
||||
|
||||
// push argument 1
|
||||
@1
|
||||
D = A
|
||||
@ARG
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(ARG + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// pop static Class2.1
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@Class2.1
|
||||
M = D
|
||||
// ^ Class2.1 = D
|
||||
|
||||
// push constant 0
|
||||
@0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// return
|
||||
@LCL
|
||||
D = M
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = FRAME = LCL
|
||||
@5
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@R14
|
||||
M = D
|
||||
// ^ R14 = RET = *(FRAME - 5)
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@ARG
|
||||
A = M
|
||||
M = D
|
||||
// ^ POP into *ARG
|
||||
@ARG
|
||||
D = M + 1
|
||||
@SP
|
||||
M = D
|
||||
// ^ SP = ARG + 1
|
||||
@1
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THAT
|
||||
M = D
|
||||
// ^ THAT = *(FRAME - 1)
|
||||
@2
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THIS
|
||||
M = D
|
||||
// ^ THIS = *(FRAME - 2)
|
||||
@3
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = *(FRAME - 3)
|
||||
@4
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = *(FRAME - 4)
|
||||
@R14
|
||||
A = M
|
||||
0;JMP
|
||||
// ^ goto RET
|
||||
|
||||
|
||||
// function Class2.get 0
|
||||
(Class2.get)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push static Class2.0
|
||||
@Class2.0
|
||||
D = M
|
||||
// ^ D = Class2.0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// push static Class2.1
|
||||
@Class2.1
|
||||
D = M
|
||||
// ^ D = Class2.1
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push from D
|
||||
|
||||
// sub
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
A = A - 1
|
||||
D = M
|
||||
A = A + 1
|
||||
D = D - M
|
||||
A = A - 1
|
||||
M = D
|
||||
@SP
|
||||
M = M - 1
|
||||
|
||||
// return
|
||||
@LCL
|
||||
D = M
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = FRAME = LCL
|
||||
@5
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@R14
|
||||
M = D
|
||||
// ^ R14 = RET = *(FRAME - 5)
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@ARG
|
||||
A = M
|
||||
M = D
|
||||
// ^ POP into *ARG
|
||||
@ARG
|
||||
D = M + 1
|
||||
@SP
|
||||
M = D
|
||||
// ^ SP = ARG + 1
|
||||
@1
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THAT
|
||||
M = D
|
||||
// ^ THAT = *(FRAME - 1)
|
||||
@2
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@THIS
|
||||
M = D
|
||||
// ^ THIS = *(FRAME - 2)
|
||||
@3
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = *(FRAME - 3)
|
||||
@4
|
||||
D = A
|
||||
@R13
|
||||
A = M - D
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = *(FRAME - 4)
|
||||
@R14
|
||||
A = M
|
||||
0;JMP
|
||||
// ^ goto RET
|
||||
|
||||
|
||||
2
projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp
Normal file
2
projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp
Normal file
@@ -0,0 +1,2 @@
|
||||
| RAM[0] |RAM[261]|RAM[262]|
|
||||
| 263 | -2 | 8 |
|
||||
17
projects/08/FunctionCalls/StaticsTest/StaticsTest.tst
Normal file
17
projects/08/FunctionCalls/StaticsTest/StaticsTest.tst
Normal file
@@ -0,0 +1,17 @@
|
||||
// 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/08/FunctionCalls/StaticsTest/StaticsTest.tst
|
||||
|
||||
load StaticsTest.asm,
|
||||
output-file StaticsTest.out,
|
||||
compare-to StaticsTest.cmp,
|
||||
output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1;
|
||||
|
||||
set RAM[0] 256,
|
||||
|
||||
repeat 2500 {
|
||||
ticktock;
|
||||
}
|
||||
|
||||
output;
|
||||
17
projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst
Normal file
17
projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst
Normal file
@@ -0,0 +1,17 @@
|
||||
// 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/08/FunctionCalls/StaticsTest/StaticsTestVME.tst
|
||||
|
||||
load, // loads all the VM files from the current directory.
|
||||
output-file StaticsTest.out,
|
||||
compare-to StaticsTest.cmp,
|
||||
output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1;
|
||||
|
||||
set sp 261,
|
||||
|
||||
repeat 36 {
|
||||
vmstep;
|
||||
}
|
||||
|
||||
output;
|
||||
95
projects/08/FunctionCalls/StaticsTest/Sys.asm
Normal file
95
projects/08/FunctionCalls/StaticsTest/Sys.asm
Normal file
@@ -0,0 +1,95 @@
|
||||
// Unsupported Function
|
||||
|
||||
// push constant 6
|
||||
@6
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// push constant 8
|
||||
@8
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// Unsupported Call
|
||||
|
||||
// pop temp 0
|
||||
@0
|
||||
D = A
|
||||
@5
|
||||
A = D + A
|
||||
D = A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = temp + index
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@R13
|
||||
A = M
|
||||
M = D
|
||||
// ^ *R13 = D
|
||||
|
||||
// push constant 23
|
||||
@23
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// push constant 15
|
||||
@15
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// Unsupported Call
|
||||
|
||||
// pop temp 0
|
||||
@0
|
||||
D = A
|
||||
@5
|
||||
A = D + A
|
||||
D = A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = temp + index
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
// ^ pop into D
|
||||
@R13
|
||||
A = M
|
||||
M = D
|
||||
// ^ *R13 = D
|
||||
|
||||
// Unsupported Call
|
||||
|
||||
// Unsupported Call
|
||||
|
||||
// label WHILE
|
||||
(WHILE)
|
||||
|
||||
// goto WHILE
|
||||
@WHILE
|
||||
0;JMP
|
||||
|
||||
20
projects/08/FunctionCalls/StaticsTest/Sys.vm
Normal file
20
projects/08/FunctionCalls/StaticsTest/Sys.vm
Normal file
@@ -0,0 +1,20 @@
|
||||
// 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/08/FunctionCalls/StaticsTest/Sys.vm
|
||||
|
||||
// Tests that different functions, stored in two different
|
||||
// class files, manipulate the static segment correctly.
|
||||
function Sys.init 0
|
||||
push constant 6
|
||||
push constant 8
|
||||
call Class1.set 2
|
||||
pop temp 0 // Dumps the return value
|
||||
push constant 23
|
||||
push constant 15
|
||||
call Class2.set 2
|
||||
pop temp 0 // Dumps the return value
|
||||
call Class1.get 0
|
||||
call Class2.get 0
|
||||
label WHILE
|
||||
goto WHILE
|
||||
Reference in New Issue
Block a user