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

问题描述 投票:0回答:1

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

我已经尝试用教程实现行主要表示我使用这个公式:

address = base Address +(行索引*列大小+列索引)*数据大小

到目前为止,我想出了如何进行对角线求和,但我不知道如何使用行主要表示得到的数组[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感谢阅读!

assembly mips mars-simulator
1个回答
0
投票

实现循环时,通常更容易完全解耦循环索引(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
© www.soinside.com 2019 - 2024. All rights reserved.