Add solutions for part 1
This commit is contained in:
806
projects/08/FunctionCalls/NestedCall/NestedCall.asm
Normal file
806
projects/08/FunctionCalls/NestedCall/NestedCall.asm
Normal file
@@ -0,0 +1,806 @@
|
||||
// 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/NestedCall/Sys.vm
|
||||
|
||||
// function Sys.init 0
|
||||
(Sys.init)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push constant 4000
|
||||
@4000
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THIS
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THIS
|
||||
M = D
|
||||
// ^ pop into THIS
|
||||
|
||||
// push constant 5000
|
||||
@5000
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THAT
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THAT
|
||||
M = D
|
||||
// ^ pop into THAT
|
||||
|
||||
// call Sys.main 0
|
||||
@Sys.main: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
|
||||
@0
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 0 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Sys.main
|
||||
0;JMP
|
||||
// ^ goto Sys.main
|
||||
(Sys.main:return:1)
|
||||
|
||||
|
||||
// pop temp 1
|
||||
@1
|
||||
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
|
||||
|
||||
// label Sys.init:LOOP
|
||||
(Sys.init:LOOP)
|
||||
|
||||
// goto Sys.init:LOOP
|
||||
@Sys.init:LOOP
|
||||
0;JMP
|
||||
|
||||
// function Sys.main 5
|
||||
(Sys.main)
|
||||
@0
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push 0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push 0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push 0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push 0
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push 0
|
||||
// ^ push 0 * 5
|
||||
|
||||
// push constant 4001
|
||||
@4001
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THIS
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THIS
|
||||
M = D
|
||||
// ^ pop into THIS
|
||||
|
||||
// push constant 5001
|
||||
@5001
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THAT
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THAT
|
||||
M = D
|
||||
// ^ pop into THAT
|
||||
|
||||
// push constant 200
|
||||
@200
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop local 1
|
||||
@1
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
D = D + A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = local + 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 40
|
||||
@40
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop local 2
|
||||
@2
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
D = D + A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = local + 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 6
|
||||
@6
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop local 3
|
||||
@3
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
D = D + A
|
||||
@R13
|
||||
M = D
|
||||
// ^ R13 = local + 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 123
|
||||
@123
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// call Sys.add12 1
|
||||
@Sys.add12: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
|
||||
@1
|
||||
D = D - A
|
||||
@5
|
||||
D = D - A
|
||||
@ARG
|
||||
M = D
|
||||
// ^ ARG = SP - 1 - 5
|
||||
@SP
|
||||
D = M
|
||||
@LCL
|
||||
M = D
|
||||
// ^ LCL = SP
|
||||
@Sys.add12
|
||||
0;JMP
|
||||
// ^ goto Sys.add12
|
||||
(Sys.add12: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
|
||||
|
||||
// push local 0
|
||||
@0
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// push local 1
|
||||
@1
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// push local 2
|
||||
@2
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// push local 3
|
||||
@3
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// push local 4
|
||||
@4
|
||||
D = A
|
||||
@LCL
|
||||
A = M
|
||||
A = D + A
|
||||
D = M
|
||||
// ^ D = *(LCL + index)
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
// ^ push D
|
||||
|
||||
// add
|
||||
@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
|
||||
|
||||
// add
|
||||
@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
|
||||
|
||||
// add
|
||||
@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
|
||||
|
||||
// add
|
||||
@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
|
||||
|
||||
|
||||
// function Sys.add12 0
|
||||
(Sys.add12)
|
||||
@0
|
||||
D = A
|
||||
// ^ push 0 * 0
|
||||
|
||||
// push constant 4002
|
||||
@4002
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THIS
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THIS
|
||||
M = D
|
||||
// ^ pop into THIS
|
||||
|
||||
// push constant 5002
|
||||
@5002
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// pop pointer THAT
|
||||
@SP
|
||||
A = M
|
||||
A = A - 1
|
||||
D = M
|
||||
@SP
|
||||
M = M - 1
|
||||
@THAT
|
||||
M = D
|
||||
// ^ pop into THAT
|
||||
|
||||
// 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
|
||||
|
||||
// push constant 12
|
||||
@12
|
||||
D = A
|
||||
@SP
|
||||
A = M
|
||||
M = D
|
||||
@SP
|
||||
M = M + 1
|
||||
|
||||
// add
|
||||
@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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user