title: Loop through an array MIPS Assembly
body: <p>I'm working on a program which loops through an array of 10 numbers. The first 9 elements have values higher than 0, the 10th has a value of 0. The loop should break when the 0 is encountered. </p>
  
  <pre><code>i=0;
  while(A[i]!=0)
  {
      A[i]=A[i]+1;
      i++;
  }
  </code></pre>
  
  <p>I know I can use 'beq' to break the loop if the value of the register is equal to 0. However I don't know enough about manipulating values in the memory. </p>
  
  <p>It's my first time using MIPS and you'll see it's a mess. If you can't fix it for me, can you give me some pointers? </p>
  
  <pre><code>.data  #by default, the "data segment" starts at address 0x10010000
  .word 1
  .word 2
  .word 3
  .word 4
  .word 5
  .word 6
  .word 7
  .word 8
  .word 9
  .word 0
  
  .text #instructions start below
  
  # MIPS assembly code
  
  lui  $a0, 0x1001           # $a0 = 0x10010000
  addi $a1, $zero, 0         # i = 0
  jal increment              # call the procedure
  </code></pre>
  
  <p>Here's where I'm most lost:</p>
  
  <pre><code>increment:
  lui $a0, 0x1001           # $a0 = 0x10010000
  beq $a0, $zero, else      # if $a0 holds 0 goto 'else'
  addi $a0, $a0, 2          # +2
  addi $a1, $zero, 1        # i = i + 1
  
  jr $ra                   #jump to caller
  </code></pre>
  
  <p>$v0 should hold the sum of all the incremented values.</p>
  
  <pre><code>else: 
  add $a0, $v0, $zero #copy result as input to syscall
  addi $v0,$zero,1 #service 1 for syscall is print integer
  syscall
  </code></pre>
  
  <p>Finishes with an infinite loop.</p>
  
  <pre><code>infinite: j infinite
  </code></pre>