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

时间:2017-05-14 19:22:28

标签: mips

我已经看到这个问题已经被问到,但是我试图找出为什么这个逻辑不起作用。我已经尝试过这段代码,将其翻译成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

1 个答案:

答案 0 :(得分:1)

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

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

在第一行中,如果$ t4&lt;&lt;&lt; $ T7。看起来很好,但是如果$ t4&lt; $ t7它会跳过分支,然后转到下一行,即 else 。所以,这个blz在这里是用的,因为无论如何它都会进入else行,所以这段代码将始终打印出数组的最后一个元素。

但如果您更改代码如下:

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

它将跳过&#34;移动$ t7,$ t4 line&#34;如果$ t7&gt; $ t4,所以它会给你你想要的东西。