MIPS SPIM-CACHE模拟器lw异常

时间:2016-01-30 09:38:37

标签: arrays compare 2d mips

所以我必须为我的大学写一个MIPS中的代码,它将A [i] [j]与B [i] [j](A和B是4x4阵列)进行比较,并将放置最大的A [i] [j]中的数字和B [i] [j]中的最小数字。这是我已经写过的代码:

.data
Ann: .word 4, 6, 10, 5, 4, 7, 10, 8, 3, 6 ,7, 12, 3, 2, 15, 6
Ban: .word 3, 7, 5, 6, 5, 12, 18, 9, 7, 6, 12, 4, 2, 7, 8, 4


.text            
.globl main      

main:   la    $t0, Ann       # $t0 represents start address of A[i][j]
la    $t1, Ban           # $t1 represents start address of B[i][j]
lw    $s2,0($t0)
lw    $s1,0($t1)                         

addi   $s5, $zero, 4    # set maximum iteration to be 4 
addi   $s6, $zero, 0     # set i = 0

loopi:  addi   $s7, $zero, 0     # set j = 0
jal    loopj             # starts inner loopj
addi   $s6, $s6, 1       # i++
bne    $s5, $s6, loopi   # continue loopi if i < 4
j      finish            

loopj:  sll    $t7, $s6, 2       
add    $t7, $t7, $s7
sll    $t7, $t7, 2       # 4 * ((i * 4) + j)  
add    $t9, $t7, $s2     # address of A[i][j]
lw     $t6, 0($t9)       # value of A[i][j]
add    $t4, $t7, $s1     # address of B[i][j]
lw     $t5, 0($t4)       # value of B[i][j]


slt $t8,$t6,$t5         
beqz $t8,cont
add $t2,$zero,$t6
add $t6,$zero,$t5
add $t5,$zero,$t2
sw $t6,0($t4)
sw $t5,0($t9)        
cont:   addi   $s7, $s7, 1       # j++
bne    $s5, $s7, loopj   # continue loopj if j < 4
jr $ra







 finish: li  $v0, 1           
    add $a0,$s5, $zero 
    syscall

当我尝试将其运行到spim缓存时,我在指令“lw $ t6,0($ t9)#A [i] [j]的值”中得到异常....可能是错的,我不知道:\

1 个答案:

答案 0 :(得分:0)

我建议你学习如何使用像SPIM和MARS这样的模拟器提供的调试功能,因为找到这样的错误原因非常简单。

如果您只是尝试正常运行该程序,您将获得一堆执行,第一个执行PC = 0x400064,即lw $t6, 0($t9)

因此,您将断点设置为0x400064,并且当遇到断点时,检查寄存器值以查看它们是否合理。好吧,$t9包含值4,这不是尝试读取的合理地址。

您通过添加$t9$t7获得了$s2的值,因此接下来要做的就是查看这两个寄存器。 $t7的值为0,这似乎没问题,因为我们在第一次迭代时,ij都是0. $s2的值为4 ,这似乎是错误的,因为我将假设这应该是数组的基地址。

你是如何最终得到$s2=4的?通过执行lw $s2,0($t0)Ann数组中的第一个值加载到$s2。这就是你的问题。