nand2tetris/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm

371 lines
4.2 KiB
NASM

@256 // init starts
D=A
@SP
M=D // initialized SP to 256
@300
D=A
@LCL
M=D // initialized @LCL to 300
@400
D=A
@ARG
M=D // initialized @ARG to 400, init ends
@Sys.init
0;JMP
(Main.fibonacci) // function Main.fibonacci 0
@ARG
A=M
D=M
@SP
A=M
M=D
@SP
M=M+1 // end push argument 0 (L1)
@2 // push constant 2
D=A
@SP
A=M
M=D
@SP
M=M+1 // end push constant 2 (L2)
@SP // ==== lt ====
A=M-1
D=M
A=A-1
D=M-D
M=0
M=M-1
@43
D;JLT
@SP
A=M-1
A=A-1
M=0
@SP
M=M-1 // end lt (L3)
@SP
AM=M-1
D=M
@Main.fibonacciIF_TRUE
D;JNE // end if-goto IF_TRUE (L4)
@Main.fibonacciIF_FALSE
0;JMP // end goto IF_FALSE (L5)
(Main.fibonacciIF_TRUE) // end label IF_TRUE (L6)
@ARG
A=M
D=M
@SP
A=M
M=D
@SP
M=M+1 // end push argument 0 (L7)
@SP
A=M-1
D=M
@ARG
A=M
M=D
@ARG
D=M+1
@SP
M=D // @SP = ARG+1
@LCL
D=M
@R13
M=D // Save LCL to R13
A=D-1 // A=*LCL-1
D=M // D=*(*LCL-1)
@THAT // A=THAT
M=D // *that = *(*lcl-1)
@R13
A=M-1
A=A-1 // A=*LCL-2
D=M // D=*(*LCL-2)
@THIS // A=THIS
M=D // *THIS = *(*lcl-2)
@R13
A=M-1
A=A-1
A=A-1 // A=*LCL-3
D=M // D=*(*LCL-3)
@ARG // A=ARG
M=D // *ARG = *(*lcl-3)
@R13
A=M-1
A=A-1
A=A-1
A=A-1 // A=*LCL-4
D=M // D=*(*LCL-4)
@LCL // A=LCL
M=D // *LCL = *(*lcl-4)
@R13
A=M-1
A=A-1
A=A-1
A=A-1
A=A-1 // A=*LCL-5
A=M // A=*(*LCL-5)
0;JMP // Jump to *(LCL-5)
(Main.fibonacciIF_FALSE) // end label IF_FALSE (L9)
@ARG
A=M
D=M
@SP
A=M
M=D
@SP
M=M+1 // end push argument 0 (L10)
@2 // push constant 2
D=A
@SP
A=M
M=D
@SP
M=M+1 // end push constant 2 (L11)
@SP // ==== sub ====
A=M-1
D=M
A=A-1
M=M-D
@SP
M=M-1 // end sub (L12)
@5fd25fdab54b4bfd5a91536ecfd6806e
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL // Read @LCL to A
D=M // Put @LCL to D
@SP
A=M
M=D // Save @LCL to SP
@SP
M=M+1
@ARG // Read @ARG to A
D=M // Put @ARG to D
@SP
A=M
M=D // Save @ARG to SP
@SP
M=M+1
@THIS // Read @THIS to A
D=M // Put @THIS to D
@SP
A=M
M=D // Save @THIS to SP
@SP
M=M+1
@THAT // Read @THAT to A
D=M // Put @THAT to D
@SP
A=M
M=D // Save @THAT to SP
@SP
M=M+1
@SP
D=M
@LCL
M=D
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
@ARG
M=D
@Main.fibonacci // Jump to Main.fibonacci
0;JMP
(5fd25fdab54b4bfd5a91536ecfd6806e) // return back from function here
@ARG
A=M
D=M
@SP
A=M
M=D
@SP
M=M+1 // end push argument 0 (L14)
@1 // push constant 1
D=A
@SP
A=M
M=D
@SP
M=M+1 // end push constant 1 (L15)
@SP // ==== sub ====
A=M-1
D=M
A=A-1
M=M-D
@SP
M=M-1 // end sub (L16)
@a954c9cff71cdccc09f4338e60df6394
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL // Read @LCL to A
D=M // Put @LCL to D
@SP
A=M
M=D // Save @LCL to SP
@SP
M=M+1
@ARG // Read @ARG to A
D=M // Put @ARG to D
@SP
A=M
M=D // Save @ARG to SP
@SP
M=M+1
@THIS // Read @THIS to A
D=M // Put @THIS to D
@SP
A=M
M=D // Save @THIS to SP
@SP
M=M+1
@THAT // Read @THAT to A
D=M // Put @THAT to D
@SP
A=M
M=D // Save @THAT to SP
@SP
M=M+1
@SP
D=M
@LCL
M=D
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
@ARG
M=D
@Main.fibonacci // Jump to Main.fibonacci
0;JMP
(a954c9cff71cdccc09f4338e60df6394) // return back from function here
@SP // ==== add ====
A=M-1
D=M
A=A-1
M=D+M
@SP
M=M-1 // end add (L18)
@SP
A=M-1
D=M
@ARG
A=M
M=D
@ARG
D=M+1
@SP
M=D // @SP = ARG+1
@LCL
D=M
@R13
M=D // Save LCL to R13
A=D-1 // A=*LCL-1
D=M // D=*(*LCL-1)
@THAT // A=THAT
M=D // *that = *(*lcl-1)
@R13
A=M-1
A=A-1 // A=*LCL-2
D=M // D=*(*LCL-2)
@THIS // A=THIS
M=D // *THIS = *(*lcl-2)
@R13
A=M-1
A=A-1
A=A-1 // A=*LCL-3
D=M // D=*(*LCL-3)
@ARG // A=ARG
M=D // *ARG = *(*lcl-3)
@R13
A=M-1
A=A-1
A=A-1
A=A-1 // A=*LCL-4
D=M // D=*(*LCL-4)
@LCL // A=LCL
M=D // *LCL = *(*lcl-4)
@R13
A=M-1
A=A-1
A=A-1
A=A-1
A=A-1 // A=*LCL-5
A=M // A=*(*LCL-5)
0;JMP // Jump to *(LCL-5)
(Sys.init) // function Sys.init 0
@4 // push constant 4
D=A
@SP
A=M
M=D
@SP
M=M+1 // end push constant 4 (L21)
@dd19df789547baebfea110998cdf5713
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL // Read @LCL to A
D=M // Put @LCL to D
@SP
A=M
M=D // Save @LCL to SP
@SP
M=M+1
@ARG // Read @ARG to A
D=M // Put @ARG to D
@SP
A=M
M=D // Save @ARG to SP
@SP
M=M+1
@THIS // Read @THIS to A
D=M // Put @THIS to D
@SP
A=M
M=D // Save @THIS to SP
@SP
M=M+1
@THAT // Read @THAT to A
D=M // Put @THAT to D
@SP
A=M
M=D // Save @THAT to SP
@SP
M=M+1
@SP
D=M
@LCL
M=D
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
D=D-1
@ARG
M=D
@Main.fibonacci // Jump to Main.fibonacci
0;JMP
(dd19df789547baebfea110998cdf5713) // return back from function here
(Sys.initWHILE) // end label WHILE (L23)
@Sys.initWHILE
0;JMP // end goto WHILE (L24)
@369
0;JMP