因此,我有一个大小为10的数组,我想创建一个稀疏数组(这意味着每次数组元素的值都为非零时,将其位置和值存储在稀疏数组中,例如:array = {0,0,1,0,5},sparseArray = {2,1,4,5}),问题是由于某种原因,$ t4(以及($ t2))的值也发生了变化,无法理解为什么,例如,当我在调用createSparse子例程后尝试打印数组时,它已完全更改。
createSparse:
li $t0, 0 #t0: counter for iteration in the for loop for checking all the array elements
li $t1, 0 #t1: counter for the length of the sparse array
move $t2, $a1 #t2: contains the address for the first element of the array
move $t3, $a2 #t3: contains the address for the first element of the sparse array
loop2:
beq $t0, 10, return2 #start of the for iteration.
lw $t4, ($t2) #load the value of the array temporarily in $t4
beq $t4, 0, continue #check if $t4 == 0
sw $t0, ($t3) #if it is not zero store the position it had in the array in the sparseArray
addi $t3, $t3, 4 #go to the next element of the sparseArray
sw $t4, ($t3) #store the value
addi $t3, $t3, 4 #go to the next element of the sparse array
addi $t1, $t1, 2 #length of the sparse array increased by 2
addi $t0, $t0, 1 #t0 += 1;
addi $t2, $t2, 4 #t2 += 4;
j loop2
continue: #if the value of the element of the array we checked equals zero then we go to check the next element of the array
addi $t0, $t0, 1
addi $t2, $t2, 4
j loop2
return2:
move $v0, $a2
move $v1, $t1
jr $ra
答案 0 :(得分:0)
我毕竟找到了解决方案,所以如果有人遇到相同的问题,我将发布它。
存储在寄存器$ t2和$ t3中的地址在ram中彼此重叠,因此当我将$ t0存储在($ t3)中时,它将擦除存储在($ t2)中的内容,而是存储$ t0。 / p>
因此,如果您想解决此问题,请不要写:
sw $t0, ($t3)
您应该写
sw $t0, 40($t3)
现在,由于数组的长度为10 x 4字节。现在,您将其存储在ram的后40个字节中,并且不会擦除ram的前40个字节中存储的内容。
如果有人要添加其他内容,那将非常有帮助。