B
Erstmal thx für deine Antwort..!
Ja, ich bin mir sicher, dass das korrekter MIPS Assembler Code ist (Also Code für den MIPS-Simulator).
Dass jetzt der Code richtig ist bin ich mir nicht sicher, auf jeden Fall funktioniert er so (benutze PCSpim 6.5), natürlich ohne den while-Befehl, da ich das noch nicht geschafft habe zu implentieren.
Ich versuche dir mal mein Gedanken, die zu diesem Code geführt haben zu erleutern, vielleicht verstehst du dann mein Problem.
Ich suchte eine Möglichkeit die vom User eingegebene Zahlen zu speichern, also habe ich mir überlegt das so zu machen:
sw $s1, ($sp) # speichere die zahl im stack
addi $sp,$sp,-4 # zeiger(stack-pointer) zeigt eine stelle weiter im stack
Die erste Zahl wird im Stack gespeichert, der Stack-Pointer um ein Wort erhöht, damit ich ja die nächste Zahl speichern kann. Das passiert in eine schleife, bis der User die 0 getippt hat...wenn das passiert versuche ich die Zahlen zu sortieren (das ist der nächste Schritt).
Damit ich weiss wieviele Zahlen der User eingetippt hat, erhöhe ich den register $s0, der am Anfang 0 ist, bei jeder Eingabe immer um 1.
addi $s0,$s0,1 # $s0 um 1 erhöhen, da der user eine eingabe gemacht hat
Wenn jetzt der User die 0 getippt hat gehe ich mittels
beq $s1,0, sort # wenn die zahl gleich 0 ist --> gehe zu sort
zu dem zweiten Schritt, der Sort heisst.
Weil jetzt der Stack-pointer auf der letzten Zahl zeigt multipliziere ich $s0 (also die Anzahl der Zahlen, dei der User getippt hat) mit der 4 mit folgendem Befehl
mul $t0,$s0,4 # $t0 = $s0 * 4 - Anzahl der Elemente mal 4
und addiere das ergebnis mittels
add $sp,$sp,$t0
mit dem Zeiger, so das jetzt der Stack-pointer wieder am Anfang zeigt(also auf der ersten eingegebenen Zahl)
Diese Zahl speichere ich in $t1, erhöhe den Zeiger um ein Wort weiter, sodas er auf die zweite zahl zeigt, speichere die nachfolgende Zahl in $t2, vergleiche ob die Zahlen verschieden sind und wenn $t2 < $t1, dann vertausche ich die Zahlen und speichere die wieder im Stack (Zeile 36-43).
Hier erhöhe ich noch den register $s2 (ist am anfang 0) um eins. (Den brauche ich um die sort_loop schleife zu verlassen)
Dann vergleiche ich die nächsten beiden Zahlen usw usw. Das ganze passiert so oft bis $s2 = $s0 ist..:
beq $s2,$s0,print # wenn $s2 gleich $s0, dann gehe zu print
Wenn das passiert sollte eigentlich die sort_loop nochmal laufen und zwar so oft wie die Anzahl der eingegebene Zahlen, also so oft wie $s0.
Der Zeiger sollte eigentlich an der letzten Zahl zeigen und ich sollte dann mit dem Befehl
mul $t0,$s0,4 # $t0 = $s0 * 4 - Anzahl der Elemente mal 4
add $sp,$sp,$t0
den Zeiger wieder auf der ersten Zahl zeigen lassen.
Leider passiert das ja nicht, weil wie du bei print siehst muss ich erst
mul $t0,$s0,4 # $t0 = $s0 * 4 - Anzahl der Elemente mal 4
add $sp,$sp,$t0 # NORMAL
und dann
addi $sp,$sp,-4 # NICHT NORMAL
also den Zeiger noch eine Stelle weiter zeigen lassen.
Ich glaube hier liegt mein Problem.
Sonst könnte ich while so schreiben
while:
beq $s4,$s0,print # wenn $s4=$s0, dann wurde while n mal ausgeführt
# also gehe zu print (n: Anzahl der Zahlen)
addi $s2,$s2,$zero # $s2=0, damit die sort_loop schleife wieder n mal läuft
addi $s4,$s4,1 # $s4 += 1
j sort_loop
sort_loop:
# alles bleibt gleich, nur der befehl "beq $s2,$s0,print" ändert sich in
beq $s2,$s0, while # da ich ja die while-schleife wiederholen will
Hoffe du hast mein Problem verstanden..!
MFG Bonafide..!