Files
N2T/projects/08/FunctionCalls/NestedCall/NestedCall.asm
2020-11-15 13:57:48 -05:00

807 lines
6.3 KiB
NASM

// 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