如何将用户选择的 row/column 的所有元素添加到矩阵(MIPS 程序集)中?

How to add all the elements of a row/column selected by the user in a matrix (MIPS Assembly)?

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

我已经尝试通过教程实现行主要表示,其中我使用了这个公式:

address = base Address + (row Index * column Size + column Index)* data Size

到目前为止,我已经弄清楚了如何进行对角线求和,但我不知道如何将行和列与我通过主行获得的数组 [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。如果您想查看所有代码,请检查此 pastebin 文件。 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 代码,实现就很简单了。先计算初始值,再循环body+increment+test condition.

这是一个可能的 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