我已经看到这个问题已经被问到,但是我试图找出为什么这个逻辑不起作用。我已经尝试过这段代码,将其翻译成C ++并且工作正常。但这里是打印数组的最后一个元素。帮助
.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
答案 0 :(得分:1)
编译器从上到下读取代码,让我们看一下计算代码的最小部分:
blt $t4, $t7, else # If first element is < 9999, go to else
else: move $t7, $t4 # Min = Array[i]
在第一行中,如果$ t4&lt;&lt;&lt; $ T7。看起来很好,但是如果$ t4&lt; $ t7它会跳过分支,然后转到下一行,即 else 。所以,这个blz在这里是用的,因为无论如何它都会进入else行,所以这段代码将始终打印出数组的最后一个元素。
但如果您更改代码如下:
blt $t7, $t4, else # If first element is < 9999, go to else
move $t7, $t4 # Min = Array[i]
else:
...
它将跳过&#34;移动$ t7,$ t4 line&#34;如果$ t7&gt; $ t4,所以它会给你你想要的东西。