异常7 MIPS功能中的数据地址错误错误

发布于 2025-01-27 14:15:19 字数 1453 浏览 1 评论 0原文

下面的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文