50 lines
1.3 KiB
Plaintext
50 lines
1.3 KiB
Plaintext
// This file is part of www.nand2tetris.org
|
|
// and the book "The Elements of Computing Systems"
|
|
// by Nisan and Schocken, MIT Press.
|
|
// File name: projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm
|
|
|
|
// Puts the first argument[0] elements of the Fibonacci series
|
|
// in the memory, starting in the address given in argument[1].
|
|
// Argument[0] and argument[1] are initialized by the test script
|
|
// before this code starts running.
|
|
|
|
push argument 1
|
|
pop pointer 1 // that = argument[1]
|
|
|
|
push constant 0
|
|
pop that 0 // first element in the series = 0
|
|
push constant 1
|
|
pop that 1 // second element in the series = 1
|
|
|
|
push argument 0
|
|
push constant 2
|
|
sub
|
|
pop argument 0 // num_of_elements -= 2 (first 2 elements are set)
|
|
|
|
label MAIN_LOOP_START
|
|
|
|
push argument 0
|
|
if-goto COMPUTE_ELEMENT // if num_of_elements > 0, goto COMPUTE_ELEMENT
|
|
goto END_PROGRAM // otherwise, goto END_PROGRAM
|
|
|
|
label COMPUTE_ELEMENT
|
|
|
|
push that 0
|
|
push that 1
|
|
add
|
|
pop that 2 // that[2] = that[0] + that[1]
|
|
|
|
push pointer 1
|
|
push constant 1
|
|
add
|
|
pop pointer 1 // that += 1
|
|
|
|
push argument 0
|
|
push constant 1
|
|
sub
|
|
pop argument 0 // num_of_elements--
|
|
|
|
goto MAIN_LOOP_START
|
|
|
|
label END_PROGRAM
|