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