//FunctionCalls/FibonacciElement/FibonacciElement @256 D=A @SP M=D //function Sys.init 0 //label Sys.init (Sys.init) //push constant4 @4 D=A @SP A=M M=D @SP M=M+1 //call Main.fibonacci 1 // computes the 4'th fibonacci element @RA$1 D=A @SP A=M M=D @SP M=M+1 //push ram1 @1 D=M @SP A=M M=D @SP M=M+1 //push ram2 @2 D=M @SP A=M M=D @SP M=M+1 //push ram3 @3 D=M @SP A=M M=D @SP M=M+1 //push ram4 @4 D=M @SP A=M M=D @SP M=M+1 @5 D=A @SP D=M-D @1 D=D-A @ARG M=D @SP D=M @LCL M=D //goto Main.fibonacci @Main.fibonacci 0;JMP //label RA$1 (RA$1) //label WHILE (WHILE) //goto WHILE @WHILE 0;JMP //FunctionCalls/FibonacciElement/FibonacciElement @256 D=A @SP M=D //function Main.fibonacci 0 //label Main.fibonacci (Main.fibonacci) //push argument0 @0 D=A @ARG A=M+D D=M @SP A=M M=D @SP M=M+1 //push constant2 @2 D=A @SP A=M M=D @SP M=M+1 //lt // checks if n<2 @SP M=M-1 A=M D=M A=A-1 D=M-D @jmp0 D;JLT @SP A=M-1 M=0 @end0 0;JMP (jmp0) @SP A=M-1 M=-1 (end0) //if-goto IF_TRUE @SP A=M-1 D=M @SP M=M-1 @IF_TRUE D;JGT //goto IF_FALSE @IF_FALSE 0;JMP //label IF_TRUE (IF_TRUE) //push argument0 @0 D=A @ARG A=M+D D=M @SP A=M M=D @SP M=M+1 @LCL D=M @endframe M=D @5 D=A @endframe D=M-D A=D D=M @R15 M=D @SP A=M-1 D=M @ARG A=M M=D @ARG D=M @SP M=D+1 @1 D=A @endframe D=M-D A=D D=M @THAT M=D @2 D=A @endframe D=M-D A=D D=M @THIS M=D @3 D=A @endframe D=M-D A=D D=M @ARG M=D @4 D=A @endframe D=M-D A=D D=M @LCL M=D @R15 A=M 0;JMP //label IF_FALSE (IF_FALSE) //push argument0 @0 D=A @ARG A=M+D D=M @SP A=M M=D @SP M=M+1 //push constant2 @2 D=A @SP A=M M=D @SP M=M+1 //sub @SP M=M-1 A=M D=M A=A-1 M=M-D //call Main.fibonacci 1 // computes fib(n-2) @RA$2 D=A @SP A=M M=D @SP M=M+1 //push ram1 @1 D=M @SP A=M M=D @SP M=M+1 //push ram2 @2 D=M @SP A=M M=D @SP M=M+1 //push ram3 @3 D=M @SP A=M M=D @SP M=M+1 //push ram4 @4 D=M @SP A=M M=D @SP M=M+1 @5 D=A @SP D=M-D @1 D=D-A @ARG M=D @SP D=M @LCL M=D //goto Main.fibonacci @Main.fibonacci 0;JMP //label RA$2 (RA$2) //push argument0 @0 D=A @ARG A=M+D D=M @SP A=M M=D @SP M=M+1 //push constant1 @1 D=A @SP A=M M=D @SP M=M+1 //sub @SP M=M-1 A=M D=M A=A-1 M=M-D //call Main.fibonacci 1 // computes fib(n-1) @RA$3 D=A @SP A=M M=D @SP M=M+1 //push ram1 @1 D=M @SP A=M M=D @SP M=M+1 //push ram2 @2 D=M @SP A=M M=D @SP M=M+1 //push ram3 @3 D=M @SP A=M M=D @SP M=M+1 //push ram4 @4 D=M @SP A=M M=D @SP M=M+1 @5 D=A @SP D=M-D @1 D=D-A @ARG M=D @SP D=M @LCL M=D //goto Main.fibonacci @Main.fibonacci 0;JMP //label RA$3 (RA$3) //add // returns fib(n-1) + fib(n-2) @SP M=M-1 A=M D=M A=A-1 M=D+M @LCL D=M @endframe M=D @5 D=A @endframe D=M-D A=D D=M @R15 M=D @SP A=M-1 D=M @ARG A=M M=D @ARG D=M @SP M=D+1 @1 D=A @endframe D=M-D A=D D=M @THAT M=D @2 D=A @endframe D=M-D A=D D=M @THIS M=D @3 D=A @endframe D=M-D A=D D=M @ARG M=D @4 D=A @endframe D=M-D A=D D=M @LCL M=D @R15 A=M 0;JMP