title: MIPS Address out of range (MARS)
body: <p>I'm trying to write a simple code which save string and integer input into an array and then prints them (i will also later add another part which sorts them,but i have to get this to work first). </p>
  
  <pre><code>.data
  array:      .space  40  #10 elements array
  
  
  in_name:
     .asciiz "\nInsert name: "
  in_date:
     .asciiz "\nInsert date (mmdd): "
  appt:
     .asciiz "\nList: "
  spaz:       .asciiz " "
  
  .text
  main:       
  
      la  $s0, array      #load array in s0
      addi    $t0, $zero, 0       #t0=0 counter
      addi    $s1, $zero, 0       #s1=0 array size counter
              j    Input
  
  Input:
          li  $v0, 4           
      la  $a0, in_date
      syscall             #ask date 
      li  $v0, 5          
      syscall             #read date
      add     $t1, $zero, $t0                #offset in t1
      add     $t1, $t1, $t1           #t1*2
      add     $t1, $t1, $t1           #t1*4
      add     $s2, $t1, $s0           #array with offset in s2
      sw  $v0, 0($s2)     #save date
      addi    $t0, $t0, 1     #t0++
      addi    $s1, $s1, 1     #array size counter +1
      li      $v0, 4
      la      $a0, in_name          
      syscall                         #ask name
      li      $v0, 8
      syscall                         #read name
      add     $t1, $zero, $t0                #offset in t1
      add     $t1, $t1, $t1           #t1*2
      add     $t1, $t1, $t1           #t1*4
      add     $s2, $t1, $s0           #array with offset in s2
      sw  $v0, 0($s2)     #save name
      addi    $s1, $s1, 1     #array size counter +1
      addi    $t0, $t0, 1     #t0++
      beq $s1, 10, print          #if array size=10 go to print
      j   Input               #start over until s1=10
  
  
  
     print:
      la  $a0, appt           
      li  $v0, 4          
      syscall             #print list
      addi    $t0, $zero, 0       #t0=0 counter
  
  res:
      add     $t1, $zero, $t0                #offset in t1
      add     $t1, $t1, $t1           #t1*2
      add     $t1, $t1, $t1           #t1*4
      add     $s2, $t1, $s0           #array with offset in s2
      lw  $a0, 0($s2)     #load date
      li  $v0, 1          
      syscall             #print data
      addi    $t0, $t0, 1             #t0++
      la  $a0, spaz               #load space
      li  $v0, 4          
      syscall             #print space
      add     $t1, $zero, $t0                #offset in t1
      add     $t1, $t1, $t1           #t1*2
      add     $t1, $t1, $t1           #t1*4
      add     $s2, $t1, $s0           #array with offset in s2
      lw  $a0, 0($s2)     #load name
      li      $v0, 4
      syscall                         #print name
      addi    $t0, $t0, 1             #t0++
      la      $a0, spaz             
      syscall                         #print space
      addi    $t0, $t0, 1     #t0++ counter
      bne $t0, $s1, res           #start over until t0=s1
      j   end         
   end:
      li  $v0, 10         
      syscall             #the end
  </code></pre>
  
  <p>With MARS i get this: line 75: Runtime exception at 0x004000e4: address out of range 0x00000008. The code seems to read correctly, and it prints the first integer i input, and then i get an error when it tries to print the first string. I'm new to mips so the code is probably really bad, and i have some trouble dealing with arrays. What am i doing wrong?</p>
  
  <p>Edit: Thanks to Michael answer i understood what i was doing wrong, but it looks like i don't understand how to do it correctly. I tried adding this code</p>
  
  <pre><code>    li      $a0, 4                 
      li      $v0, 9
      syscall                         #space for new word (4bytes)
      move    $a0, $v0
      li      $a1, 4
      li      $v0, 8
      syscall                         #read name
  </code></pre>
  
  <p>before the read_string but i still get the same error. How should i do it?</p>