Как найти максимальные и минимальные значения в массивах Integer и Float в MIPS? - PullRequest
0 голосов
/ 13 февраля 2019

Я ОЧЕНЬ новичок в MIPS, и я очень растерялся.Что мне нужно сделать, это найти максимальные и минимальные значения как в целочисленном массиве, так и в массиве с плавающей точкой.Я попытался адаптировать ответ из сортировочного массива в mips (сборка) , чтобы попытаться отсортировать массив, но я не уверен, куда идти дальше, плюс, я знаю, что пытался отсортировать массив с плавающей точкойочень неправильно.Я извиняюсь, поскольку знаю, что написанное мной, вероятно, очень глупо, но любая помощь будет ОЧЕНЬ признательна!

.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 голосов
/ 13 февраля 2019

Вам определенно не нужно сортировать массив, чтобы найти max и min, а ваш код бесполезно сложен.

Просто обойдите массив один раз и запомните, каковы максимальные и минимальные значения.

Вот возможная версия для 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

Версия с плавающей точкой похожа (иоставил как упражнение).

...