如何在矩阵(MIPS程序集)中添加用户选择的行/列的所有元素?



我被困在这个问题的b,c,d问题中,这些问题要求我设置一个整数矩阵(内存已分配)并询问用户该怎么做: a) 打印矩阵。 b) 显示位置数组中的元素[i][J]. c) 添加用户选择的行的所有元素。 d) 添加用户选择的列的所有元素。 e) 添加矩阵的所有元素。

我已经尝试通过教程实现我使用此公式的行主要表示形式:

地址 = 基址 + (行索引 * 列大小 + 列索引)* 数据大小

到目前为止,我想出了如何进行对角线和,但我不知道如何使用行主要表示形式获得的数组[0][0]的第一个地址对行和列求和。

在问题b)。我在网上也没有找到任何关于如何做到这一点的信息。

英语不是我的母语,如果您需要更好的解释,请告诉我,我会尝试!

.text
main:
# Sum diagonal
la $a0, mat
lw $a1, size
jal sumDiagonal
move $a0, $v0                   
li $v0, 1
syscall
sumDiagonal:
li $v0, 0   # sum = 0
li $t0, 0   # $t0 as the index
sumLoop:
mul $t1, $t0, $a1   # t1 = rowIndex * colSize
add $t1, $t1, $t0   #       + colIndex
mul $t1, $t1, DATA_SIZE # * DATA_SIZE
add $t1, $t1, $a0   # + base address
lw $t2, ($t1)       
add $v0, $v0, $t2   # sum = sum + mdArray[i][i]

addi $t0, $t0, 1    # i = i + i
blt $t0, $a1, sumLoop   # if i < size, then loop again
jr $ra

矩阵是一个 3x3 矩阵,其中 3 作为所有值。如果您想查看所有代码,请检查此粘贴文件。https://pastebin.com/8619qHrL 感谢您的阅读!

实现循环时,通常更容易完全解耦循环索引 (i) 和地址管理(数组元素的计算 @),而不是在每次迭代时从索引计算地址。它更容易理解和更有效(这就是编译器的工作方式)。

要计算行或列和,这可能对应于以下代码

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

最新更新