BasicLoop missing lines of code

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

BasicLoop missing lines of code

A_Random_Person
This post was updated on .

In my BasicLoop.vm, after line 20 (push argument 0), I am missing two lines of code (a push and some kind of comparison (lt, gt, and eq). Right after (at line 21), there is a if-goto LOOP_START with an argument 0 on the stack. This is what my BasicLoop.vm looks like:
// 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/BasicLoop/BasicLoop.vm
// Computes the sum 1 + 2 + ... + argument[0] and pushes the
// result onto the stack. Argument[0] is initialized by the test
// script before this code starts running.

push constant 0
pop local 0 // initializes sum = 0
label LOOP_START
push argument 0
push local 0
add
pop local 0 // sum = sum + counter
push argument 0
push constant 1
sub
pop argument 0 // counter--
push argument 0
// MISSING CODE HERE
if-goto LOOP_START // If counter > 0, goto LOOP_START
push local 0

Reply | Threaded
Open this post in threaded view
|

Re: BasicLoop missing lines of code

WBahn
Administrator
I'm at a loss as to what you are asking or trying to accomplish.
Reply | Threaded
Open this post in threaded view
|

Re: BasicLoop missing lines of code

ivant
In reply to this post by A_Random_Person
This test is for the VM to ASM translator. The BasicLoop.vm program already works correctly and you don't need to change it. What you need to do is to translate it to HACK assembly language and to run the tests.

If you don't understand how the vm program works, read on. The if-goto LABEL instruction, reads the value from the top of the stack and jumps to the label if the value is not zero. In this case, the value that we put on the stack is the current value of argument 0. This starts with the initial value provided as the parameter, but on each loop iteration we are decreasing it by 1 (the lines after "sum = sum + counter" comment up to and including the "counter--" comment). At some point this will reach 0 and the if-goto will not jump, thus exiting the loop.