MIPS程序集中的不可谷歌错误

时间:2013-10-02 18:46:22

标签: assembly mips mars-simulator

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

  

开发人员:您必须使用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

1 个答案:

答案 0 :(得分:2)

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

la $t1 head

然后你在那个地址之后存储一个单词:

sw $t3, 4($t1)

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