【问题标题】:Finding the Max and Min values of a 10 element array in MIPS在 MIPS 中查找 10 元素数组的最大值和最小值
【发布时间】:2014-10-20 21:10:53
【问题描述】:

一旦谈到 MIPS 编程,我还是个新手,所以请多多包涵。我正在尝试编写一个通过 10 元素数组并返回数组的最大值和最小值的函数。到目前为止,我有:

.data

X .word 31, 17, 92, 46, 172, 208, 13, 93, 65, 112
N .word 10
minValue .asciiz "Minimum Value: "
maxValue .asciiz "\nMaximum Value: "
values .asciiz "\nValues divisible by 4: "


.text

main:

la $a0, X
la $a1, N


jal MaxMin


MaxMin:
lw $t0, 0($a0)


swap:
move $t0, $s0
move $s0, $s1
move $s0, $t0

MaxMin 函数应该返回 X 数组的最大值和最小值,以便我打印出来。我的计划是遍历数组,如果一个元素大于或小于另一个元素,则使用 swap 函数交换它们。问题是我不知道该怎么做,因为我真的不知道在处理数组时应该使用的语法。如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

    标签: assembly mips spim qtspim


    【解决方案1】:

    先用C写算法怎么样?

    #include <stddef.h>
    
    struct minmax
    {
    int max;
    int min;
    };
    
    struct minmax maxmin(int const *in, size_t n)
    {
      struct minmax ret = {*in,*in};
      for (size_t i = 1; i<n; i++)
      {
        in++;
        if (*in > ret.max)
          {
            ret.max = *in;
          }
        if (*in < ret.min)
          {
            ret.min = *in;
          }
      }
      return ret;
    }
    

    要在等效的 MIPS 程序集中迭代数组,您可以将指针 in 加载到临时寄存器中:

    la $t0, in
    

    然后通过从内存中加载值来取消引用指针:

    lw $t1, ($t0)
    

    最后在循环中增加指针:

    addiu $t0, $t0, 4
    

    【讨论】:

      【解决方案2】:

      这里有一个关于如何通过函数读取和打印数组元素的想法。会进行比较并进行交换。

      .data
      space: .asciiz " "
      X: .word 31, 17, 92, 46, 172, 208, 13, 93, 65, 112
      N: .word 10
      
      .text
      main:   la $a0, X       #$a0=load address of array X
          lw $a1, N       #$a1=10  --number elements
          jal readArray  #call readArray
          li $v0, 10      #exit program   
          syscall 
      
      readArray:
          li $t0, 0       #$t0=0
          li $t1, 0       #$t1=0
      buc:    bge $t0, $a1, final #if  $t0 >= $a1 then goto final
          lw $a0, X($t1) #$a0 = X(i)
          li $v0, 1       #Print integer              
          syscall
      
          la $a0, space   #load a space:  " "
          li $v0, 4       #print string               
          syscall
      
          addi $t1, $t1, 4    #Every 4 bytes there is an integer in the array
          addi $t0, $t0, 1    #$t0=$t0+1
          b buc       #goto buc
      final:  
          jr $ra      #return
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-21
        • 2012-10-18
        • 2018-05-03
        • 1970-01-01
        • 2019-02-24
        • 2021-09-15
        • 2017-08-18
        相关资源
        最近更新 更多