0

一旦谈到 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 函数交换它们。问题是我不知道该怎么做,因为我真的不知道在处理数组时应该使用的语法。如果有人可以提供帮助,我将不胜感激。

4

2 回答 2

3

先用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
于 2014-10-20T22:18:04.643 回答
1

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

.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
于 2014-10-21T05:47:26.553 回答