2017-05-14 7 views
-1

finden Ich habe gesehen, dass diese Frage bereits gestellt wurde, aber ich versuche zu finden, warum diese Logik nicht funktioniert. Ich habe diesen Code ausprobiert, es in C++ übersetzt und es funktioniert gut. Aber hier wird das letzte Element des Arrays gedruckt. Hilfe?Min Element des Arrays in MIPS

.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 

Antwort

1

Compiler den Code von oben nach unten liest, schauen wir uns an den minimalen Teil des Codes Berechnung:

blt $t4, $t7, else   # If first element is < 9999, go to else 
else: move $t7, $t4   # Min = Array[i] 

In der ersten Zeile, verzweigt er zu sonst wenn t4 < $ $ t7. Sieht für diese Situation gut aus, aber wenn $ t4 < $ t7 es Verzweigungen überspringt, dann passiere die nächste Zeile, die deine sonst ist. Also, dieses blz ist uselles hier, weil es die Else-Linie sowieso gehen wird, so wird dieser Code immer das letzte Element Ihres Arrays drucken.

Aber wenn Sie Ihren Code ändern wie:

blt $t7, $t4, else   # If first element is < 9999, go to else 
    move $t7, $t4   # Min = Array[i] 
else: 
... 

Es wird überspringen "move $ t7, $ t 4 line", wenn $ t7> $ t4, so wird es euch geben, was Sie wollen.

+0

Sorry, ich verstehe nicht, was Sie mit dem Code erreichen (Ich bin Anfänger bei MIPS). Wenn ich blt $ t7, $ t4, sonst, was soll ich dann in "else" Label schreiben? Ich übersetze meinen Code wie folgt: Wenn 500 <9999 dann min ist 500, Wenn 100 <500 dann ist min 100, und wenn 250 <100 dann geht die Verzweigung nicht zu else und min bleibt 100. Ich nicht Sehen Sie das Problem hier in dieser Aussage? – illuminated

+0

Denke nicht "anders" wie "sonst" in C (oder einer anderen) Sprache. Es ist nur ein Label, Sie können es "myelse" umbenennen und nichts wird geändert. Wenn Sie Ihren Code in C konvertieren, ist es wie folgt: if (t4 solohane

+0

Ja, aber dies speichert nicht $ t4 (das kleinste Element) in $ t7. – illuminated

Verwandte Themen