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

195 lines
1.5 KiB
NASM

// push constant 0
@0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// pop local 0
@0
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
// label LOOP_START
(LOOP_START)
// 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
// 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
// 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
// pop local 0
@0
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 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
// push constant 1
@1
D = A
@SP
A = M
M = D
@SP
M = M + 1
// 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
// pop argument 0
@0
D = A
@ARG
A = M
D = D + A
@R13
M = D
// ^ R13 = argument + index
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@R13
A = M
M = D
// ^ *R13 = D
// 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
// if-goto LOOP_START
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
@LOOP_START
D;JNE
// 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