Значение в адресе меняется, не меняя его в мипах - PullRequest
0 голосов
/ 29 декабря 2018

Итак, у меня есть массив размером 10, и я хочу создать разреженный массив (что означает, что каждый раз, когда элемент массива имеет ненулевое значение, сохраняйте свою позицию и значение в разреженном массиве, пример: массив= {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 голосов
/ 31 декабря 2018

В конце концов, я нашел решение, поэтому я опубликую его на тот случай, если у кого-то возникнет такая же проблема.

Адреса, которые хранятся в регистрах $ t2 и $ t3, перекрывают друг друга в ram.поэтому, когда я сохраняю $ t0 в ($ t3), он стирает то, что было сохранено в ($ t2), и вместо этого сохраняет $ t0.

Так что если вы хотите обойти эту проблему, вместо записи:

sw $t0, ($t3)

Вы должны написать

sw $t0, 40($t3)

Итак, теперь массив имеет длину 10 x 4 байта.Теперь вы сохраняете его в следующих 40 байтах оперативной памяти, и оно не стирает то, что хранится в первых 40 байтах оперативной памяти.

Если кому-то есть что добавить, это было бы очень полезно.

...