цикл по массиву, используя цикл while?- MIPS - PullRequest
4 голосов
/ 11 мая 2011

Я хочу перебрать массив чисел типа

.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2

и я хочу убедиться, что все в массиве имеет значение 2. Теперь это 52 элемента, поэтому каждый раз, когда я хочу проверить, все ли элементы массива равны 2., иначе сделайте что-нибудь еще.

Вот что я сделал до сих пор:

add $t6,$0,$0
add $t7,$0,$0
SL:
addi $t6,$t6,4
addi $t7,$t7,1
la $t1,array
add $t1,$t1,$t6
lw $s0,($t1)
j check

slti $t8,$t7,52
bnez $t8,SL
jr $ra
check:
li $t3,2
seq $t4,$s0,$t3
beqz $t4,do_something
bnez $t4,exit
jr $ra

Но когда я создаю такой массив

   .word 0,2,2,2,2,2,2,0,2,2,2,2,2
   .word 2,2,2,2,2,2,2,2,2,2,2,2,
   .word 2,2,2,2,2,2,2,0,2,2,2,2,2
   .word 2,2,2,2,2,2,2,2,2,2,2,2,0

он по-прежнему завершается, хотя массив не все 2 с.

1 Ответ

1 голос
/ 08 июня 2011

Чтобы сделать это, вы должны начать с доступа к первому элементу каждого массива, а затем зацикливаться, пока ваш указатель (или адрес памяти) не выйдет за пределы диапазона массива.Адрес массива также является адресом первого элемента (и имеет смещение 0 битов), а последний элемент имеет смещение 48 битов.

Пусть $ t0 будет адресом текущего элементаи $ t1 выходит за пределы.

la    $t0, array
addiu $t1, $t0, 52  # 52 is outside the array
L1: 
beq   $t0, t1, L2
# do something here
addiu  $t0, $t0, 4
j     L1
L2:
# this part of the code happens after you traverse through an array.

Кроме того, вы можете использовать addi вместо addiu, но, как вы, вероятно, узнаете позже, курс addi может вызвать исключение.

...