异常7 MIPS功能中的数据地址错误错误
下面的MIPS组装程序是QSELECT,它是QuickSelect算法的一部分。当令人发指时,它会打印“异常7 [不良数据地址]发生并忽略\ n” 我尚未完全理解这意味着什么或如何修复它。也许分区功能有问题
qselect:
# a0 = f
# a1 = l
# a2 = k
addi $sp, $sp, -4 #adjust stack for 1 item
sw $ra, 0($sp)
if1:
#if !(f < 1+l) goto else0
addi $t0, $a1, 1 #t0 = l+1
slt $t0, $a0, $t0 #if f<1+l t0 = 1
beq $t0, $zero, else0 # if t0 = 0 goto else0
#int p = partition(f,l);
jal partition #v0 becomes p
lw $ra, 0($sp) #restore ra
#if (p==k) goto else_if2
beq $v0, $a2,else_if2
if2: #if p < k return qselect(f,p-1,k);
slt $t1, $a2, $v0 #if p > k, t1 = 1
beq $t1, $zero, qselectp1lk # if t1 = 0 goto qselectp1lk
qselectfp1k:
#return qselect(f,p-1,k);
addi $a1, $v0, -1 # a1 = p-1
jal qselect
lw $ra, 0($sp) # restore ra
j end_qselect
else0: #return v[f];
la $t0, v # t0 = address of v
sll $t1, $a0, 2 # t1 = 4*f
add $t1, $t1, $t0 #t1 = address of v[f]
lw $v0, 0($t1) #v0 = v[f]
j end_qselect
else_if2:
#return v[k];
la $t0, v # t0 = address of v
sll $t1, $a2, 2 # t1 = 4*k
add $t1, $t1, $t0 #t1 = address of v[k]
lw $v0, 0($t1) #v0 = v[k]
j end_qselect
qselectp1lk: # return qselect(p+1,l,k);
addi $a0, $v0, 1 # a0 = p+1
jal qselect
lw $ra, 0($sp) #restore ra
end_qselect:
lw $ra, 0($sp)
addi $sp, $sp, 4 #restore stack
jr $ra #return to caller
the mips assembly program below is the function qselect which is part of the quickselect algorithm. When compilling, it prints "Exception 7 [Bad data address] occurred and ignored\n"
I haven't yet understood exactly what that means or how I can fix it. Perhaps the partition function has the issue
qselect:
# a0 = f
# a1 = l
# a2 = k
addi $sp, $sp, -4 #adjust stack for 1 item
sw $ra, 0($sp)
if1:
#if !(f < 1+l) goto else0
addi $t0, $a1, 1 #t0 = l+1
slt $t0, $a0, $t0 #if f<1+l t0 = 1
beq $t0, $zero, else0 # if t0 = 0 goto else0
#int p = partition(f,l);
jal partition #v0 becomes p
lw $ra, 0($sp) #restore ra
#if (p==k) goto else_if2
beq $v0, $a2,else_if2
if2: #if p < k return qselect(f,p-1,k);
slt $t1, $a2, $v0 #if p > k, t1 = 1
beq $t1, $zero, qselectp1lk # if t1 = 0 goto qselectp1lk
qselectfp1k:
#return qselect(f,p-1,k);
addi $a1, $v0, -1 # a1 = p-1
jal qselect
lw $ra, 0($sp) # restore ra
j end_qselect
else0: #return v[f];
la $t0, v # t0 = address of v
sll $t1, $a0, 2 # t1 = 4*f
add $t1, $t1, $t0 #t1 = address of v[f]
lw $v0, 0($t1) #v0 = v[f]
j end_qselect
else_if2:
#return v[k];
la $t0, v # t0 = address of v
sll $t1, $a2, 2 # t1 = 4*k
add $t1, $t1, $t0 #t1 = address of v[k]
lw $v0, 0($t1) #v0 = v[k]
j end_qselect
qselectp1lk: # return qselect(p+1,l,k);
addi $a0, $v0, 1 # a0 = p+1
jal qselect
lw $ra, 0($sp) #restore ra
end_qselect:
lw $ra, 0($sp)
addi $sp, $sp, 4 #restore stack
jr $ra #return to caller
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论