Files
N2T/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm
2020-11-15 13:57:48 -05:00

351 lines
2.8 KiB
NASM

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