0

我正在使用 IDE Mars 在 R3000 MIPS 程序集中编写程序。这是我正在上的一门课。任务是编写一个函数,该函数遍历链表并删除任何值小于参数中给定整数的节点。我想我已经解决了问题,但是在测试过程中我一直遇到这个运行时异常:

开发人员:您必须使用 setStatement() 写入文本段!0x00000014

我一点也不知道是什么导致了这个错误。我试过用谷歌搜索它,但没有任何相关的东西出现。我什至不知道这是汇编代码还是 Mars IDE 的问题。真正奇怪的是,即使在相同的情况下,它似乎也不会一直出现。如果我有错误,有时我会更改代码(通常通过注释掉其中一个系统调用),运行它,如果我改回代码,它会消失并且不会回来。

这是我的函数代码。参数是链表中第一个节点的地址,以及删除节点的截止值,分别在 $a0 和 $a1 中。

   .text
cleanup:
    add $t0, $a0, $0    #keep the argument from being modified
    la  $t1, head   #the address for the first node
    sw  $a0, head   #the head points at the first word now

    li  $v0, 1      #DEBUG
    li  $t7, 0      #DEBUG

while:
    lw  $t2, ($t0)  #get the node value
    bge $t2, $a1, else  #IF the node value is >= x, skip the next bit

    add $a0, $t1, $0    #DEBUG
    syscall         #DEBUG

    lw  $t3, 4($t0) #get the address of the next node
    sw  $t3, 4($t1) #store the address of the next node to the next node address of the previous node
    b   ifend       #skip to the end of the if statement
else:
    lw  $t1, ($t0)  #ELSE set pointer to previous node to this node

ifend:
    la  $t4, 4($t0) #need to check if the end of the list is nigh
    beq $t4, -1, out    #exit loop at the end of the list
    lw  $t0, 4($t0) #set current node pointer to the next node


    addi    $t7, $t7, 1 #DEBUG
    addi    $a0, $t7, 0 #DEBUG
    syscall         #DEBUG

    b   while       #and loop!

out:

    .data
head:
    .word 0
4

1 回答 1

2

只需查看您的代码,在第一次通过时,$t1将其设置为 head 的地址:

la $t1 head

然后你存储到该地址之后的一个单词:

sw $t3, 4($t1)

这意味着您将在数据段中分配的位于头部的单词之后写入一个单词。但是因为您的数据段只包含一个单词,所以任何人都可以猜测它会去哪里——在这种情况下,可能是您的文本段,因此会出现错误。

于 2013-10-02T19:25:36.833 回答