@256 D=A @SP M=D @FibonacciElement$ret_init D=A @SP A=M M=D @LCL D=M @SP AM=M+1 M=D @ARG D=M @SP AM=M+1 M=D @THIS D=M @SP AM=M+1 M=D @THAT D=M @SP AM=M+1 M=D @SP MD=M+1 @LCL M=D @5 D=D-A @ARG M=D @Sys.init 0;JMP (FibonacciElement$ret_init) // function Main.fibonacci 0 (Main.fibonacci) // push argument 0 @ARG D=M @0 A=D+A D=M @SP A=M M=D @SP M=M+1 // push constant 2 @2 D=A @SP A=M M=D @SP M=M+1 // lt @SP AM=M-1 D=M A=A-1 D=M-D M=0 @END_LT_0 D;JGE @SP A=M-1 M=-1 (END_LT_0) // if-goto IF_TRUE @SP AM=M-1 D=M @Main$IF_TRUE D;JNE // goto IF_FALSE @Main$IF_FALSE 0;JMP // label IF_TRUE (Main$IF_TRUE) // push argument 0 @ARG D=M @0 A=D+A D=M @SP A=M M=D @SP M=M+1 // return @LCL D=M @5 A=D-A D=M @R13 M=D @SP A=M-1 D=M @ARG A=M M=D @ARG D=M+1 @SP M=D @LCL AM=M-1 D=M @THAT M=D @LCL AM=M-1 D=M @THIS M=D @LCL AM=M-1 D=M @ARG M=D @LCL AM=M-1 D=M @LCL M=D @R13 A=M 0;JMP // label IF_FALSE (Main$IF_FALSE) // push argument 0 @ARG D=M @0 A=D+A D=M @SP A=M M=D @SP M=M+1 // push constant 2 @2 D=A @SP A=M M=D @SP M=M+1 // sub @SP AM=M-1 D=M A=A-1 M=M-D // call Main.fibonacci 1 @Main$ret.0 D=A @SP A=M M=D @LCL D=M @SP AM=M+1 M=D @ARG D=M @SP AM=M+1 M=D @THIS D=M @SP AM=M+1 M=D @THAT D=M @SP AM=M+1 M=D @SP MD=M+1 @LCL M=D @6 D=D-A @ARG M=D @Main.fibonacci 0;JMP (Main$ret.0) // push argument 0 @ARG D=M @0 A=D+A D=M @SP A=M M=D @SP M=M+1 // push constant 1 @1 D=A @SP A=M M=D @SP M=M+1 // sub @SP AM=M-1 D=M A=A-1 M=M-D // call Main.fibonacci 1 @Main$ret.1 D=A @SP A=M M=D @LCL D=M @SP AM=M+1 M=D @ARG D=M @SP AM=M+1 M=D @THIS D=M @SP AM=M+1 M=D @THAT D=M @SP AM=M+1 M=D @SP MD=M+1 @LCL M=D @6 D=D-A @ARG M=D @Main.fibonacci 0;JMP (Main$ret.1) // add @SP AM=M-1 D=M A=A-1 M=D+M // return @LCL D=M @5 A=D-A D=M @R13 M=D @SP A=M-1 D=M @ARG A=M M=D @ARG D=M+1 @SP M=D @LCL AM=M-1 D=M @THAT M=D @LCL AM=M-1 D=M @THIS M=D @LCL AM=M-1 D=M @ARG M=D @LCL AM=M-1 D=M @LCL M=D @R13 A=M 0;JMP // function Sys.init 0 (Sys.init) // push constant 4 @4 D=A @SP A=M M=D @SP M=M+1 // call Main.fibonacci 1 @Sys$ret.0 D=A @SP A=M M=D @LCL D=M @SP AM=M+1 M=D @ARG D=M @SP AM=M+1 M=D @THIS D=M @SP AM=M+1 M=D @THAT D=M @SP AM=M+1 M=D @SP MD=M+1 @LCL M=D @6 D=D-A @ARG M=D @Main.fibonacci 0;JMP (Sys$ret.0) // label WHILE (Sys$WHILE) // goto WHILE @Sys$WHILE 0;JMP