2017-02-09 13 views
0

Okay, das könnte eine wirklich dumme Frage sein, aber ich habe noch nicht ganz den Überblick über Assembly. Ich muss ein Programm schreiben, das die Summe einer Reihe von Zahlen berechnet. Es sollte wie so verhalten:

MIPS Constructing Loops

Enter the first integer in the series: 5 
Enter the number of integers in the series: 3 
Enter the offset between integers in the series: 4 

The series is: 5, 9, 13. 
The summation of the series is 27. 

Would you like to calculate another summation (Y/N)? y 

Enter the first integer in the series: 4 
Enter the number of integers in the series: 5 
Enter the offset between integers in the series: 27 

The series is 4, 31, 58, 85, 112. 
The summation of the series is 290. 

Would you like to calculate another summation (Y/N)? Y 

Enter the first integer in the series: -16 
Enter the number of integers in the series: -22 
There must be a positive number of integers in the series. 

Would you like to calculate another summation (Y/N)? n 

Dies ist, was ich bisher:

li $v0, 4 #put 4 in as main parameter in v0 
la $a0, Q1 #syscall will print string query 1 
syscall 

Shop erste Ganzzahl in Serie in s0

li $v0, 5 #put 5 in as main parameter in v0 
syscall  #syscall will read integer from Q1 
move $s0, $v0 #move integer in v0 to s0 

Anfrage Anzahl der Zahlen in Serie

li $v0, 4 #put 4 in as main parameter in v0 
la $a0, Q2 #syscall will print string query 2 
syscall 

Shop Anzahl der Zahlen in Serie in s1

li $v0, 5 #put 5 in as main parameter in v0 
syscall  #syscall will read integer from Q2 
move $s1, $v0 #move integer in v0 to s1 

Anfrage von ganzen Zahlen Offset

li $v0, 4 #put 4 in as main parameter in v0 
la $a0, Q3 #syscall will print string query 3 
syscall 

Shop Offset von ganzen Zahlen in s2

li $v0, 5 #put 5 in as main parameter in v0 
syscall  #syscall will read integer from Q3 
move $s2, $v0 #move integer in v0 to s1 

Set Zähler

li $s3, 1 #Set counter to zero 
li $t0, 1 #iterator count is in t0 

Ich bin nur neugierig, wo ich meine Schleife starten soll? Und wie genau würde ich die gesamte Serie drucken? Jeder Rat würde sehr geschätzt werden.

Antwort

0

Ich bin mir nicht sicher, was Sie in "Set Counter" -Teil tun, da die s1 bereits die Anzahl der Serienmitglieder enthält.

Und s0 enthält aktuelles Element.

Alles, was Sie (weitere Informationen) benötigen, ist current_sum zu löschen, lassen Sie uns als s3 sagen:

add $s3, $zero, $zero ; or "move $s3, $zero" if you prefer the pseudo-ops 

So für Ihr erstes Beispiel s0-s3 wird [5, 3, 4, 0] vor dem ersten Schleifendurchlauf eingestellt werden. Dies ist alles, was Sie brauchen, ein anderer Wert, den Sie einstellen werden, ist wahrscheinlich eine temporäre für bestimmte Unteraufgaben wie die Anzeige eines Wertes und Ähnliches, aber solange die Kernberechnung läuft, repräsentieren diese vier Werte alles, was Sie tun brauchen, und alles andere kann auf ihnen basieren.

Wenn s1 bereits weniger als 1 (<=0 Test) ist, melden Sie einen falschen Eingang.

dann wird die Schleife Algorithmus:

  • aktuelles Element hinzuzufügen (s0) zur aktuellen Summe (s3) ; summing up all numbers
  • Anzeigestromelement (s0)
  • ; handle the correct count of series' members
  • Dekrementierungszähler s1
  • Wenn s1 Null ist, dann gehe zu exit_ loop
  • ; preparing for next loop iteration
  • add Offset (s2) zum aktuellen Element (s0)
  • Anzeige ", "
  • Sprung zum ersten Schritt

exit_loop: Logik Druckzeilenende umfassen wird, Summationstextbeschreibung, aktueller Summenwert (s3), weitere neue Zeile (n) und Abfrage nach Wiederholung y/n.

Zum Beispiel, dass 4-Kern-Werte während der Iterationen wie folgt entwickeln wird:

  • [5, 3, 4, 0] => zeigt "5, " + alle die Aktualisierung der Werte
  • [9, 2, 4, 5] => zeigt "9, " + alle die Aktualisierung der Werte
  • [13, 1, 4, 14] => ändert s3 zu 27, Anzeigen "13", --s1, springt zu exit_loop

Bei exit_loop sind die Kernwerte [13, 0, 4, 27], Code wird 27 als Seriensumme angezeigt.

+0

Ich denke, ich machte es komplizierter als es sein musste. Wenn der Zähler gleich der Anzahl der Ints in der Reihe wäre, würde er zur Ausgangsschleife gehen. Die Struktur, nach der ich suchte, war etwas wie: für i im Bereich (x), first_int + (i * offset). Ich habe auch total vergessen, eine Schnur für das Komma zu setzen! Danke für die Hilfe. – Bri

+0

@Bri in der Regel "es komplizierter zu machen" ist ein Zeichen dafür, dass man zu schnell in Code schreibt. Stellen Sie zunächst sicher, dass Sie einen guten Überblick über die verwendeten Algorithmen und Kerndaten der Aufgabe haben (irreduzibles Grunddaten-Set, bei dem das Entfernen von Werten die Aufgabe unmöglich macht, da sie nicht abgeleitet werden kann) von den restlichen) (wie "Modell" in MVC Programmierung Design-Muster). Normalerweise folgen diese Kernwerte 1: 1 den Eingabedaten, oder nur einige mehr werden benötigt wie iteration_number/time/keyboard_event. Sammeln Sie auch Notizen zu abgeleiteten (und wie) Werten. Schreibe den Code nach ... – Ped7g

+0

Die Arbeit mit den Assembleranweisungen ist zu langwierig und erfordert viel Aufmerksamkeit im Gehirn, nur um die richtige Instruktion in korrekter Syntax und mit korrekten Registern zu verwenden. Daher ist es in der Regel besser, zuerst in der Muttersprache über die Aufgabe nachzudenken. eine Zeit lang, in einfachere Schritte aufzuspalten, und nach irgendwelchen Redundanzen/Ähnlichkeiten zu suchen, um sie als Subroutinen zu extrahieren/etc. – Ped7g