地址更改的值,而不更改其mips

时间:2018-12-29 16:18:50

标签: mips spim qtspim

因此,我有一个大小为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

1 个答案:

答案 0 :(得分:0)

我毕竟找到了解决方案,所以如果有人遇到相同的问题,我将发布它。

存储在寄存器$ t2和$ t3中的地址在ram中彼此重叠,因此当我将$ t0存储在($ t3)中时,它将擦除存储在($ t2)中的内容,而是存储$ t0。 / p>

因此,如果您想解决此问题,请不要写:

sw $t0, ($t3)

您应该写

sw $t0, 40($t3)

现在,由于数组的长度为10 x 4字节。现在,您将其存储在ram的后40个字节中,并且不会擦除ram的前40个字节中存储的内容。

如果有人要添加其他内容,那将非常有帮助。