Assembly 如何在MIPS中的整数和浮点数组中查找最大值和最小值?
我是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,
.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)
)