// 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 pointer THAT @SP A = M A = A - 1 D = M @SP M = M - 1 @THAT M = D // ^ pop into THAT // push constant 0 @0 D = A @SP A = M M = D @SP M = M + 1 // pop that 0 @0 D = A @THAT A = M D = D + A @R13 M = D // ^ R13 = that + 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 1 @1 D = A @SP A = M M = D @SP M = M + 1 // pop that 1 @1 D = A @THAT A = M D = D + A @R13 M = D // ^ R13 = that + 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 2 @2 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 // label MAIN_LOOP_START (MAIN_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 // if-goto COMPUTE_ELEMENT @SP A = M A = A - 1 D = M @SP M = M - 1 @COMPUTE_ELEMENT D;JNE // goto END_PROGRAM @END_PROGRAM 0;JMP // label COMPUTE_ELEMENT (COMPUTE_ELEMENT) // push that 0 @0 D = A @THAT A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // push that 1 @1 D = A @THAT 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 that 2 @2 D = A @THAT A = M D = D + A @R13 M = D // ^ R13 = that + index @SP A = M A = A - 1 D = M @SP M = M - 1 // ^ pop into D @R13 A = M M = D // ^ *R13 = D // push pointer THAT @THAT D = M @SP A = M M = D @SP M = M + 1 // ^ push THAT // push constant 1 @1 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 // 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 = *(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 // goto MAIN_LOOP_START @MAIN_LOOP_START 0;JMP // label END_PROGRAM (END_PROGRAM)