所以我必须为我的大学写一个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]的值”中得到异常....可能是错的,我不知道:\
答案 0 :(得分:0)
我建议你学习如何使用像SPIM和MARS这样的模拟器提供的调试功能,因为找到这样的错误原因非常简单。
如果您只是尝试正常运行该程序,您将获得一堆执行,第一个执行PC = 0x400064,即lw $t6, 0($t9)
。
因此,您将断点设置为0x400064,并且当遇到断点时,检查寄存器值以查看它们是否合理。好吧,$t9
包含值4,这不是尝试读取的合理地址。
您通过添加$t9
和$t7
获得了$s2
的值,因此接下来要做的就是查看这两个寄存器。 $t7
的值为0,这似乎没问题,因为我们在第一次迭代时,i
和j
都是0. $s2
的值为4 ,这似乎是错误的,因为我将假设这应该是数组的基地址。
你是如何最终得到$s2=4
的?通过执行lw $s2,0($t0)
将Ann
数组中的第一个值加载到$s2
。这就是你的问题。