在QTSPIM中运行代码时使内存超出范围异常

问题描述

我正在尝试使用数组保存i * j值并从数组中打印值。

我有两个循环 loop1 loop2 ,其中loop1接受i,loop2接受j。 我正在尝试将i * j保存为空间数据类型的myarray。

我遇到异常内存地址超出范围,无法找到错误所在。

Error: Could not find or load main class application.Main
Caused by: java.lang.classNotFoundException: application.Main

对于n = 4,我期望控制台中的输出

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

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

解决方法

您可以通过单步调试器来发现此问题。从显示的最小输入开始,例如n=1。在每条指令之后,请验证它是否满足您的要求,并且除了您需要的以外,没有执行其他任何操作。

这里有个提示:请注意lalw之间的区别。另外,如果要将系统调用放在代码或循环的中间,请避免为自己的变量使用$a0$v0注册-只会使事情变得更容易/更好。