如何在MIPS的整数和浮点数组中查找最大值和最小值?

时间:2019-02-13 02:45:04

标签: assembly mips

我是MIPS的初学者,我非常困惑。我需要做的是在整数数组和浮点数组中找到最大值和最小值。我试图改编sorting array in mips (assembly)的答案以尝试对数组进行排序,但是我不确定从这里到哪里,此外,我知道我尝试对float数组进行排序是非常错误的。很抱歉,我知道我写的内容可能很愚蠢,但任何帮助将不胜感激!

.data
intArray: .word 3, 53, -76, 34, 643, -234, 143, 2, -33, 64
floatArray: .float 43.53, 45.2244, 25, 64.035, 328, 23.85, 23.86544, 93.4, 46.6543256, 0.00345

.text

main:
la $t0, intArray
add $t0, $t0, 40

intOuterSort:
    add $t1, $0, $0
    la $a0, intArray

intInnerSort:
    lw $t2, 0($a0)
    lw $t3, 4($a0)
    slt $t4, $t2, $t3
    beq $t4, 0, intNext
    add $t1, $0, 1
    sw $t2, 4($a0)
    sw $t3, 0($a0)

intNext:
    addi $a0, $a0, 4
    bne $a0, $t0, intInnerSort
    bne $t1, $0, intOuterSort

la $t0, floatArray
add.s $f2, $f2, 40

floatOuterSort:
    add.s $f4, $0, $0
    la $a0, floatArray

floatInnerSort:
    li.s $f6, 0($a0)
    li.s $f8, 4($a0)
    slt $f10, $f6, $f8
    beq $f10, 0, floatNext
    add.s $f4, $0, 1
    s.s $f6, 4($a0)
    s.s $f8, 0($a0)

floatNext:
    add.s $a0, $a0, 4
    bne $a0, $f2, floatInnerSort
    bne $f4, $0, floatOuterSort

1 个答案:

答案 0 :(得分:2)

您绝对不需要对数组进行排序即可找到最大值和最小值,并且您的代码毫无用处。

只需遍历数组一次,并记住最大和最小值是什么。

以下是intSearch的可能版本

.data
intArray:       .word 3, 53, -76, 34, 643, -234, 143, 2, -33, 64
floatArray:     .float 43.53, 45.2244, 25, 64.035, 328, 23.85, 23.86544, 93.4, 46.6543256, 0.00345
minInt:         .word 0x80000000
maxInt:         .word 0x7fffffff
minFloat:       .float -3.40e+38f
maxFloat:       .float 3.40e+38f

.text

intSearch:
        la   $t0, intArray        ; $t0->@intarray
        addi $t1, $0, 10          ; $t1->N(=10)
        add  $t2, $0, $0          ; $t2->i(=0)
        lw   $t3, minInt($0)      ; $t3->imax (initialised to a small value)
        lw   $t4, maxInt($0)      ; $t4->imin (initialised to a large value)

iloop:  lw   $t5, 0($t0)          ; $t5->intArray[i]
        bgt  $t5, $t4, skipImin   ; $t5 <=? iMin
        move $t5, $t4             ; yes update min
skipIMin:                         ; skip if $t5>iMin
        blt  $t5, $t3, skipIMax   ; $t5 >= iMax
        move $t5, $t3             ; yes update max
skipIMax:                         ; skip if $t5<iMax
        addi $t2, $t2, 1          ; i++
        addi $t0, $t0, 4          ; @intArray++
        blt  $t2, $t1, iloop      ; i<n -> iloop
#       min is in $t4, max in $t3

浮动版本相似(并保留为练习)。