在MIPS中查找数组的最小元素

在MIPS中查找数组的最小元素,mips,Mips,我已经看到这个问题已经被问到了,但我正试图找出为什么这个逻辑不起作用。我已经尝试过这个代码,把它翻译成C++,它工作得很好。但在这里,它正在打印数组的最后一个元素。帮忙 .data Array: .word 500 100 250 150 Len: .word 4 Sum: .word 0 Average: .word 0 NewLine: .asciiz "\n" Min:

我已经看到这个问题已经被问到了,但我正试图找出为什么这个逻辑不起作用。我已经尝试过这个代码,把它翻译成C++,它工作得很好。但在这里,它正在打印数组的最后一个元素。帮忙

   .data

    Array:      .word 500 100 250 150

    Len:        .word 4

    Sum:        .word 0

    Average:    .word 0

    NewLine:    .asciiz "\n"

    Min:        .word 9999

    Max:        .word -9999

    .text

        la $t0, Array       # Base address
        li $t1, 0           # i = 0
        lw $t2, Len         # $t2 = Len
        li $t3, 0           # Sum = 0
        li $t5, 0           # Average = 0 
        la $t6, NewLine  
        lw $t7, Min         # $t7 = min
        lw $t8, Max         # $t8 = max

        while:
            lw   $t4, ($t0)              # Array[i]
            add  $t3, $t3, $t4           # sum += Array[i]

            blt  $t4, $t7, else          # If first element is < 9999, go to else  
            else: move $t7, $t4          # Min = Array[i]

            add  $t1, $t1, 1             # Increment index by 1
            add  $t0, $t0, 4             # Go to next array element

            blt  $t1, $t2, while         # Do this cycle till i < $t2 (length)


            sw   $t3, Sum                

            div  $t5, $t3, $t2           # Calculate avg.
            sw   $t5, Average           

            # Print sum
            li   $v0, 1
            move $a0, $t3
            syscall

            # Print new line
            li   $v0, 4
            move $a0, $t6
            syscall

            # Print average
            li $v0, 1
            move $a0, $t5
            syscall

            # Print new line
            li   $v0, 4
            move $a0, $t6
            syscall

            # Print min element
            li $v0, 1
            move $a0, $t7
            syscall
.data
数组:.word 500 100 250 150
Len:单词4
总和:。字0
平均值:。字0
换行符:.asciiz“\n”
最小:.word 9999
Max:.word-9999
.文本
la$t0,数组#基址
li$t1,0#i=0
lw$t2,Len#$t2=Len
李$t3,0#总和=0
li$t5,0#平均值=0
洛杉矶$t6,新线
lw$t7,最小值#$t7=Min
lw$t8,最大值#$t8=最大值
而:
lw$t4,($t0)#数组[i]
添加$t3、$t3、$t4#sum+=数组[i]
blt$t4、$t7、else#如果第一个元素<9999,请转到else
否则:移动$t7,$t4#Min=Array[i]
加上$t1,$t1,1#将索引增加1
添加$t0,$t0,4#转到下一个数组元素
blt$t1,$t2,而#进行此循环,直到i<$t2(长度)
sw$t3,总计
分区$t5、$t3、$t2#计算平均值。
sw$t5,平均值
#打印金额
李$v0,1
移动$a0,$t3
系统调用
#打印新行
李$v0,4
移动$a0,$t6
系统调用
#打印平均值
李$v0,1
移动$a0,$t5
系统调用
#打印新行
李$v0,4
移动$a0,$t6
系统调用
#打印最小元素
李$v0,1
移动$a0,$t7
系统调用

编译器从上到下读取代码,让我们看看如何计算代码的最小部分:

blt  $t4, $t7, else          # If first element is < 9999, go to else  
else: move $t7, $t4          # Min = Array[i]
blt$t4、$t7、else#如果第一个元素<9999,请转到else
否则:移动$t7,$t4#Min=Array[i]
在第一行中,如果$t4<$t7,它将分支到else。在这种情况下看起来不错,但如果$t4<$t7跳过分支,则传递到下一行,即您的else。因此,blz在这里使用,因为它无论如何都会转到else行,所以这段代码将始终打印数组的最后一个元素

但如果您更改代码,如:

 blt  $t7, $t4, else          # If first element is < 9999, go to else  
     move $t7, $t4          # Min = Array[i]
else:
...
blt$t7、$t4、else#如果第一个元素<9999,请转到else
移动$t7,$t4#Min=Array[i]
其他:
...

如果$t7>$t4,它将跳过“移动$t7,$t4行”,因此它将为您提供所需的内容。

对不起,我不明白您使用该代码实现了什么(我是MIPS初学者)。如果我使用blt$t7,$t4,else,那么我应该在“else”标签中写什么?我这样翻译我的代码:如果500<9999,那么min是500,如果100<500,那么min是100,当250<100,那么分支不会转到else,min仍然是100。我看不出这句话有什么问题?不要像C(或任何其他)语言中的“else”那样认为“else”。它只是一个标签,你可以把它重命名为“myelse”,什么都不会改变。当您将代码转换为C时,它就像:if(t4