Mit Geschachtelten For-Schleifen und einem Array in MIPS
Dies ist eine Hausaufgabe, die ich geschrieben habe, das ganze Programm selbst, führen Sie es im debugger, und alles spielt so, wie ich meine, AUßER für diese Linie:
sw $t1, counter($a3)
Die Zuordnung ist das konvertieren dieser Schnipsel C-code auf MIPS
for(i = 0; i < a; i++) {
for(j = 0; j < b; j++) {
C[2 * i] = i – j; } }
Alle Register Werte ändern die Weise, die Sie sollten in mein Programm außer für $a3 - Es ändert sich nie.
Änderungen: Ein array gebraucht werden, deklariert und "wies", die durch ein register und ein label kann nicht verwendet werden, die für einen Versatz in der Art und Weise begann ich mit
EDIT: Hier die fertigen, funktionierenden code
- Warum hast du erwartet, $a3 zu ändern ? Sollte es die Adresse des array, und damit sollte es nicht ändern. Eigentlich verstehe ich nicht, was dein problem ist.
- Ich bin versucht zu speichern, das Ergebnis von i - j in jeden index $a3, also sollte ich nicht sehen, einige Wert, oben knallend in den $a3 register mit dem Wert Raum? Ich bin mir nicht sicher, wie Sie Sie besser zu erklären, mich würde ein screenshot von meinem mars compiler helfen? Ich kann Ihnen zeigen, was ich sehe
- Wenn Sie die Zeile
sw $t1, x($a3)
mit x=8, der Wert von t1 wird gespeichert in $a3[2] (3. int der Arrays, zeigte $a3). Wenn es nicht der Fall ist, dann die Zeile wird nie ausgeführt. - Okay, das ist gut, das ist, was ich will, es zu tun. Wie kann ich ein array deklarieren und $a3 Punkt-zu-es?
- Ich bin mir nicht sicher über die MIPS-syntax, ist aber zu erklären, es sollte wie
myarray: .space 40
für 10 Wörter. Dann müssen Sie zum laden der Adresse in $a3, mitla $a3, myarray
, wenn ich mich nicht Irre. - Okay, Super, ich selbst überrascht, herauszufinden, dass man sich, bevor man reagiert! Aber jetzt bin ich Absturz mit dieser Fehlermeldung Zeile: Assignment2.asm Zeile 30: Runtime exception bei 0x00400064: Adresse außerhalb des Bereichs 0x20020100 siehe Auch meine Frage, verzeichnete einen screencap
- Ihre loops sind falsch. Derzeit wird die Schleife bis
i==a
, statt zu stoppen, nacha-1
. Auch dein Konstrukt ist ein wenig umständlich. Denken Sie daran, dassfor(i=0;i<a;i++){loop;}
übersetzti=0;while(i<a){loop;i++}
, und dies kann direkt übersetzt werden in die Baugruppe. - Die Linien 12 und 13 machen Sie a - 1. Und ich weiß nicht, wie zu tun, nie wirklich gearbeitet, mit Montage
- Tatsächlich, Sie haben Recht in diesem Punkt, ich habe vergessen, dass Sie verwenden
i-1
später. Trotzdem, deine loops sind immer noch falsch. Versuchen Sie zu übersetzen, diewhile
, das ist wirklich einfach. Nur zu übersetzen, was diewhile
tun, Schritt für Schritt. Nur nicht den direkten Punkt ist, dass die Bedingung ist ein "weiter" - Zustand, wenn Sie Sie brauchen, eine "exit" - Bedingung (aber das ist genau das Gegenteil). Und übersetzen eine Schleife in einer Zeit, ist es auch egal, wenn Sie doppelte Beschriftungen. - Nicht einmal zu argumentieren, sah unsere vorlesungsfolien und neu formatiert Schleifen und es funktioniert nun perfekt, nicht einmal erkennen, die for-Schleifen nicht funktionierenden rechten Zeitpunkt. Warum wirkt sich eine änderung der loop-Struktur beheben, die Adresse, out-of-bounds Problem? Und EINE LETZTE FRAGE: Wenn ich mir die Lage des Arrays in die register -, es beginnt mit einem offset von 8, aber ich sah in den debugger, und es ist nicht als ein offset gegeben, warum würde es dann nicht bei 0 beginnen?
- Hast du ändern Sie den code in deiner Frage um das problem zu beheben? Bitte tun Sie das nicht. Von nicht die die problematische code in die Frage, die man machen kann, ist es nutzlos.
- nur fügte der revision, nicht entfernen Sie alles wichtige zu das ursprüngliche problem selbst
- Noch, wenn die "fertigen, funktionierenden code", es gehört in eine Antwort, nicht die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rückblick auf die Antwort aus den Kommentaren
Ihre $a3 register geladen werden soll, mit der Adresse von einem array definiert, in der
.data
Abschnitt.Ein großes problem mit deinem code ist, wie Sie konstruiert Ihre Schleifen. Der beste Weg ist, um zu übersetzen Ihre loops Schritt für Schritt, und eine Schleife in einer Zeit,. Denken Sie auch daran, dass :
Ist äquivalent zu :
Welche ist einfacher zu übersetzen in der Montage. Die Bedingung muss nur annulliert werden, hat Sie eine "exit" - Zustand, und nicht einen "weiter" - Bedingung wie in einem
while
Schleife. Ihr code wird sehr viel klarer und einfacher zu verstehen (und weniger fehleranfällig).Ihre "out of range" - Fehler kommt von hier :
sw $t1, counter($a3)
. Hiercounter
ist ein label, und daher eine Adresse. Socounter($a3)
tun "$a3 (=0x10010008) + Adresse des Zählers (=0x100100f8)", geben 0x20020100, und das ist eindeutig nicht das, was Sie wollen (und nicht-Sinn).Oh, und in der
sw $r, offset($a)
MIPS instructionoffset
MUSS ein 16-bit-KONSTANTE. Hier verwenden Sie eine 32-bit-Adresse, aber es ist nur so, dass die assembler freundlicherweise übersetzensw $t1, counter($a3)
zu$x = $a3 + counter; sw $t1, 0($x)
, weshalb Sie unter Umständen einsw
mit 0 als offset.