Add solutions for part 1
This commit is contained in:
350
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm
Normal file
350
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm
Normal file
@@ -0,0 +1,350 @@
|
||||
// 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)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
|RAM[3000]|RAM[3001]|RAM[3002]|RAM[3003]|RAM[3004]|RAM[3005]|
|
||||
| 0 | 1 | 1 | 2 | 3 | 5 |
|
||||
22
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst
Normal file
22
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst
Normal file
@@ -0,0 +1,22 @@
|
||||
// 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.tst
|
||||
|
||||
load FibonacciSeries.asm,
|
||||
output-file FibonacciSeries.out,
|
||||
compare-to FibonacciSeries.cmp,
|
||||
output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2
|
||||
RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2;
|
||||
|
||||
set RAM[0] 256,
|
||||
set RAM[1] 300,
|
||||
set RAM[2] 400,
|
||||
set RAM[400] 6,
|
||||
set RAM[401] 3000,
|
||||
|
||||
repeat 1100 {
|
||||
ticktock;
|
||||
}
|
||||
|
||||
output;
|
||||
49
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm
Normal file
49
projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm
Normal file
@@ -0,0 +1,49 @@
|
||||
// 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
|
||||
@@ -0,0 +1,22 @@
|
||||
// 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/FibonacciSeriesVME.tst
|
||||
|
||||
load FibonacciSeries.vm,
|
||||
output-file FibonacciSeries.out,
|
||||
compare-to FibonacciSeries.cmp,
|
||||
output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2
|
||||
RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2;
|
||||
|
||||
set sp 256,
|
||||
set local 300,
|
||||
set argument 400,
|
||||
set argument[0] 6,
|
||||
set argument[1] 3000,
|
||||
|
||||
repeat 73 {
|
||||
vmstep;
|
||||
}
|
||||
|
||||
output;
|
||||
Reference in New Issue
Block a user