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

Assembly 如何在MIPS中的整数和浮点数组中查找最大值和最小值?,assembly,mips,Assembly,Mips,我是MIPS的初学者,我很困惑。我需要做的是找到整数数组和浮点数组中的最大值和最小值。我试图改编一个来自的答案来尝试对数组进行排序,但我不确定接下来该怎么做,另外,我知道我尝试对浮点数组进行排序是非常错误的。我很抱歉,因为我知道我所写的可能是非常愚蠢的,但任何帮助将不胜感激 .data intArray: .word 3, 53, -76, 34, 643, -234, 143, 2, -33, 64 floatArray: .float 43.53, 45.2244, 25, 64.035,

我是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

为了找到最大值和最小值,您肯定不需要对数组进行排序,而且您的代码非常复杂

只需遍历数组一次,记住最大值和最小值

以下是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
.data
单词3,53,-76,34,643,-234,143,2,-33,64
浮点数组:。浮点43.53,45.2244,25,64.035,328,23.85,23.86544,93.4,46.6543256,0.00345
最小值:。字0x8000000
maxInt:。字0x7fffffff
最小浮球:。浮球-3.40e+38f
最大浮点数:。浮点数3.40e+38f
.文本
intSearch:
la$t0,无阵列$t0->@intarray
addi$t1、$0、10$t1->N(=10)
加上$t2、$0、$0$t2->i(=0)
lw$t3,minInt$0$t3->imax(初始化为小值)
lw$t4,最大值($0)$t4->imin(初始化为大值)
iloop:lw$t5,0$t0$t5->intArray[i]
bgt$t5、$t4、skipImin$t5亚胺
blt$t5、$t3、skipIMax$t5>=iMax
移动$t5,$t3;是更新最大值

斯基皮马克斯:;如果$t5您肯定不需要对数组进行排序以查找最大值和最小值,并且您的代码非常复杂,请跳过

只需遍历数组一次,记住最大值和最小值

以下是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
.data
单词3,53,-76,34,643,-234,143,2,-33,64
浮点数组:。浮点43.53,45.2244,25,64.035,328,23.85,23.86544,93.4,46.6543256,0.00345
最小值:。字0x8000000
maxInt:。字0x7fffffff
最小浮球:。浮球-3.40e+38f
最大浮点数:。浮点数3.40e+38f
.文本
intSearch:
la$t0,无阵列$t0->@intarray
addi$t1、$0、10$t1->N(=10)
加上$t2、$0、$0$t2->i(=0)
lw$t3,minInt$0$t3->imax(初始化为小值)
lw$t4,最大值($0)$t4->imin(初始化为大值)
iloop:lw$t5,0$t0$t5->intArray[i]
bgt$t5、$t4、skipImin$t5亚胺
blt$t5、$t3、skipIMax$t5>=iMax
移动$t5,$t3;是更新最大值

斯基皮马克斯:;如果$T5初始值只能用即时数据创建(
lui$t3,0x8000
/
subiu$t4,$t3,1
),则跳过此步骤。或者加载第一个元素(如果已经可以假定大小为非零)。无论如何,与汇编时间常数相比,无需在静态存储中使用int初始值设定项。您好,感谢您的帮助,但不幸的是,这不起作用,因为minInt和maxInt从未更新过。它们不应该更新。它只是初始值。最小结果初始化为maxInt,最大值初始化为minInt。但正如Peter Cordes所发现的,代码可以由数组第一个元素的值的初始化来代替。删除
intMin和intMax,lw$t3。。。和lw$t4…
并将其替换为
lw$t3,0($t0)
移动$t4,t3(
lw$t4,0($t0)
)只需立即(
lui$t3,0x8000
subiu$t4,t3,1
)即可创建初始值。或者加载第一个元素(如果已经可以假定大小为非零)。无论如何,与汇编时间常数相比,无需在静态存储中使用int初始值设定项。您好,感谢您的帮助,但不幸的是,这不起作用,因为minInt和maxInt从未更新过。它们不应该更新。它只是初始值。最小结果初始化为maxInt,最大值初始化为minInt。但正如Peter Cordes所发现的,代码可以由数组第一个元素的值的初始化来代替。删除
intMin和intMax,lw$t3。。。和lw$t4…
并将其替换为
lw$t3,0($t0)
移动$t4,t3(
)(或
lw$t4,0($t0)