我正在使用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
答案 0 :(得分:2)
只需查看您的代码,在第一次传递时,$t1
将设置为head的地址:
la $t1 head
然后你在那个地址之后存储一个单词:
sw $t3, 4($t1)
这意味着您将在您在数据段中分配的头部后面的单词之后写入一个单词。但是因为你的数据段只包含一个单词,所以任何人猜测它会在哪里 - 在这种情况下可能是你的文本段因此错误。