mipsqtspim

Getting Memory out of bounds exception while running code in QTSPIM


I am trying an array to save i * j values and print the values from array.

I have two loops loop1, loop2, where loop1 takes i and loop2 takes on j. I am trying to save the i * j in a myarray which is space datatype.

I am getting exception Memory address out of bounds and unable to find whats the error.

 .data

myarray:    .space  10000
n:  .word   1
space_line: .asciiz " "
new_line:   .asciiz "\n"

    .text
    .globl main

main:

    lw $a0, n
    la $a1, myarray
    li $a2, -1  #row
    li $t0, 0  
    li $t2, 0  
    
    
    loop1:
        addi $a2, $a2,1
            
        bge $a2, $a0, print_loop    
        li $a3, 0 #column
        j loop2
         

    loop2:
        bge $a3, $a0, loop1 
        
        #multiply a2 and a3
        mul $t1, $a2, $a3
        
        sw $t1, 0($a1)
        
        addu $a1, $a1,4
        
        addi $a3, $a3,1
        
        j loop2
        
    print_loop:
    
        mul $t3, $a0, $a0
        
        bge $t0, $t3, exit
        
        li $v0, 4
        lw $a0, myarray($t2)
        syscall 
        
        li $v0, 4
        lw $a0, space_line
        syscall 
        
        rem $t4, $t3, $a0

        beqz $t4, newline
        
        addu $t2, $t2, 4
        
        addi $t0, $t0, 1
        
        j print_loop
    
    newline:
        li $v0, 4
        lw $a0, myarray($t2)
        syscall 
    
exit: 
#  Done, terminate program. 
li $v0, 10 
syscall # all done! 
.end main

For n =4,i am expecting the output in console as

 0 0 0 0 
 0 1 2 3 
 0 2 4 6
 0 4 8 12

Solution

  • You can find this problem by single stepping in the debugger.  Start with the smallest possible input, like n=1 as you're showing.  After each instruction, verify that it did what you want, and that it didn't do anything else except what you wanted.

    Here's a hint: Pay attention to the difference between la and lw.  Also, If you want to put syscalls in the middle of your code or loops, then avoid the $a0 and $v0 registers for your own variables — just makes things easier/better.