При реализации циклов, как правило, проще полностью отделить индекс цикла (i) и управление адресами (compute @ элементов массива) вместо вычисления адреса из индекса на каждой итерации. Это легче понять и эффективнее (и так работают компиляторы).
Чтобы вычислить суммы строк или столбцов, это может соответствовать следующему коду
sumRow(int *mat, int size, int row){
int sum
for(int i=0, int *ptr=mat+row*size; i!=size; i++, ptr++)
sum += *ptr
return sum;
}
sumRow(int *mat, int size, int col){
int sum=0;
for(int i=0, int *ptr=mat+col, int increment=size; i!=size; i++, ptr+=increment)
sum += *ptr
return sum;
}
Как только вы получите код на C, реализация будет простой. Сначала вычислите начальные значения, затем выполните цикл по телу + приращение + условие проверки.
Вот возможная версия mips.
sumRow:
#expects $a0 matrix, $a1 size, $a2 row to add
li $v0, 0 # sum = 0
# compute address of first element
# as ptr=matrix+rwnbr*size*4
mult $a2, $a1 # rnbr*size
mflo $t1 # get result from mult
sll $t1, $t1, 2 # *4
add $t0,$a0,$t1 # @ first element to add
li $t1,0 # index=0
sumRowLoop:
lw $t2,($t0) # sum+=*ptr
add $v0,$v0,$t2
addi $t0, $t0, 4# ptr++
addi $t1,$t1,1 # i++
bne $t1, $a1, sumRowLoop # if i != size, then loop again
jr $ra
sumCol:
#expects $a0 matrix, $a1 size, $a2 col to add
li $v0, 0 # sum = 0
# compute address of first element to add
# as ptr=array+colnbr*4
srl $t1, $a2, 2 # colnbr*4
add $t0,$a0,$t1 # $t0 @ 1rst element
li $t1,0 # $t1 i=0
srl $t3,$a1,2 # ptr increment in $t3 is size*4
sumColLoop:
lw $t2,($t0) # sum+=*ptr
add $v0,$v0,$t2
add $t0,$t0,$t3 # ptr+=increment
addi $t1,$t1,1 # i++
bne $t1, $a1, sumColLoop # if i != size, then loop again
jr $ra
Чтобы получить элемент по адресу [i] [j], вам просто нужно вычислить (i * size +
j) * 4 и добавьте его в адрес массива, чтобы получить элемент.
elementAt:
#expects $a0 matrix, $a1 size, $a2 i, $a3 j
mult $a1,$a2 # size*i
mflo $t0 # t0<-result of mult
add $t0,$t0, $a3# add it +j
sll $t0, $t0, 2 # and *sizeof(int)
add $t1, $a1,$t0# matrix+i*size+j
lw $v0,0($t1)
jr ra