在MIPS中查找数组的最小元素
我已经看到这个问题已经被问到了,但我正试图找出为什么这个逻辑不起作用。我已经尝试过这个代码,把它翻译成C++,它工作得很好。但在这里,它正在打印数组的最后一个元素。帮忙在MIPS中查找数组的最小元素,mips,Mips,我已经看到这个问题已经被问到了,但我正试图找出为什么这个逻辑不起作用。我已经尝试过这个代码,把它翻译成C++,它工作得很好。但在这里,它正在打印数组的最后一个元素。帮忙 .data Array: .word 500 100 250 150 Len: .word 4 Sum: .word 0 Average: .word 0 NewLine: .asciiz "\n" Min:
.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
.data
数组:.word 500 100 250 150
Len:单词4
总和:。字0
平均值:。字0
换行符:.asciiz“\n”
最小:.word 9999
Max:.word-9999
.文本
la$t0,数组#基址
li$t1,0#i=0
lw$t2,Len#$t2=Len
李$t3,0#总和=0
li$t5,0#平均值=0
洛杉矶$t6,新线
lw$t7,最小值#$t7=Min
lw$t8,最大值#$t8=最大值
而:
lw$t4,($t0)#数组[i]
添加$t3、$t3、$t4#sum+=数组[i]
blt$t4、$t7、else#如果第一个元素<9999,请转到else
否则:移动$t7,$t4#Min=Array[i]
加上$t1,$t1,1#将索引增加1
添加$t0,$t0,4#转到下一个数组元素
blt$t1,$t2,而#进行此循环,直到i<$t2(长度)
sw$t3,总计
分区$t5、$t3、$t2#计算平均值。
sw$t5,平均值
#打印金额
李$v0,1
移动$a0,$t3
系统调用
#打印新行
李$v0,4
移动$a0,$t6
系统调用
#打印平均值
李$v0,1
移动$a0,$t5
系统调用
#打印新行
李$v0,4
移动$a0,$t6
系统调用
#打印最小元素
李$v0,1
移动$a0,$t7
系统调用
编译器从上到下读取代码,让我们看看如何计算代码的最小部分:
blt $t4, $t7, else # If first element is < 9999, go to else
else: move $t7, $t4 # Min = Array[i]
blt$t4、$t7、else#如果第一个元素<9999,请转到else
否则:移动$t7,$t4#Min=Array[i]
在第一行中,如果$t4<$t7,它将分支到else。在这种情况下看起来不错,但如果$t4<$t7跳过分支,则传递到下一行,即您的else。因此,blz在这里使用,因为它无论如何都会转到else行,所以这段代码将始终打印数组的最后一个元素
但如果您更改代码,如:
blt $t7, $t4, else # If first element is < 9999, go to else
move $t7, $t4 # Min = Array[i]
else:
...
blt$t7、$t4、else#如果第一个元素<9999,请转到else
移动$t7,$t4#Min=Array[i]
其他:
...
如果$t7>$t4,它将跳过“移动$t7,$t4行”,因此它将为您提供所需的内容。对不起,我不明白您使用该代码实现了什么(我是MIPS初学者)。如果我使用blt$t7,$t4,else,那么我应该在“else”标签中写什么?我这样翻译我的代码:如果500<9999,那么min是500,如果100<500,那么min是100,当250<100,那么分支不会转到else,min仍然是100。我看不出这句话有什么问题?不要像C(或任何其他)语言中的“else”那样认为“else”。它只是一个标签,你可以把它重命名为“myelse”,什么都不会改变。当您将代码转换为C时,它就像:if(t4