Integer-Arrays in MIPS : Einstellung array[index], um die iteration mit dem Wert habe ich?
Arbeite ich an der übersetzung des unter C++ - code auf MIPS (dies ist nur ein kleiner Teil des Programms, dass ich stecken geblieben bin), und ich verstehe, wie $t
Register nehmen Sie die array-Werte gegeben, aber ich bin völlig stecken,
pos[count] = i;
Ich habe versucht sw
, lw
, aber jedes mal wenn ich versuche diese, bekomme ich die Adresse außerhalb des Bereichs Ausnahmen/etc.
Kann mir jemand erklären, was läuft hier falsch? Wenn die Schleife bekommt pos[count] = i
muss ich ändern pos[count]
aus 0xffffffff
zu (i)
for-each-Schleife iteration. Der Fehler kommt, weil ich einstellen muss für die -1 in pos[]
?
Ich bin völlig verloren und waren nicht in der Lage zu finden, alle Erklärungen, die sind ähnlich genug, um dieses problem.
(Entschuldigung für die Formatierung, da MIPS hat so viele Registerkarten Linien, die Formatierung für die Veröffentlichung hier ist besonders verrückte)
.data
x: .word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
pos: .word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
.word -1
d: .word 73
.word 47
.word 23
.word 26
.word 67
.word 99
.word 13
.word 53
.word 1
.word 97
sp: .asciiz " "
endl: .asciiz "\n"
# $s0 count
# $s1 key
# $s2 i
.text
main: addi $s0, $0, 0 # int count = 0;
addi $s1, $0, 24 # int key = 24;
addi $s2, $0, 0
la $s3, d
la $s4, pos
la $s5, x
# for (int i=0; i<10; i++) {
loop: mul $t0, $s2, 4 # if (d[i] >= key) {
add $t0, $t0, $s3
lw $t0, ($t0)
blt $t0, $s1, loop1
sll $t1, $s0, 2 # $t1 = count * sizeof(int)
addu $t2, $s4, $t1 # $t2 = &pos[count];
lw $t2, ($t2) # $t2 = pos[count];
add $t3, $s5, $t1 # $t3 = &x[count];
lw $t3, ($t3) # $t3 = x[count];
sw $s2, ($t2) # pos[count] = i;
# x[count] = d[i];
loop1: addi $s2, $s2, 1 # i++;
addi $s0, $s0, 1 # count++;
# }
# }
Hier ist der C++ - code-Entsprechung:
#include <iostream>
using namespace std;
int x[10] = {0};
int pos[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
int d[10] = {73, 47, 23, 26, 67, 99, 13, 53, 1, 97};
int main() {
int count = 0;
int key = 24;
for (int i=0; i<10; i++) {
if (d[i] >= key) {
pos[count] = i;
x[count] = d[i];
count++;
}
}
for (int i=0; i<10; i++) {
if (pos[i] < 0)
break;
cout << pos[i] << " " << x[i] << endl;
}
}
- Ich kann nicht Köpfe oder Schwänze diese. Es wäre hilfreich, wenn Sie zeigte, was C++ - code, die Sie versuchen zu duplizieren, und dann würden wir wissen, was diese tun soll.
- Gotcha. Ich habe gerade das C++ - äquivalent deutlich mehr an der Unterseite der post. Mein Hauptproblem ist die übersetzung pos[count] = i; und x[count] = d[i]; zu MIPS
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Teil ist falsch:
Warum sind Sie laden
pos[count]
undx[count]
wenn Sie wollen, zu schreiben? Dies ist nicht nur unnötig, Sie zerstören werden$t2
und$t3
also, wenn Sie wirklich wollen, zu schreiben, Sie wird nicht mehr gültig sein.Auch das Ende der Schleife ist falsch, die
count++
werden sollte, in der Bedingung. Für die, die Sie benötigen, um ein vertauschen der letzten beiden Zeilen (einschließlich dem Etikett).Leicht bereinigt version Aussehen könnte:
x: .word 0:10 y: .word -1:10
int count(int a[], int n, int x){ int res = 0; int i = 0; for(i = 0; i != n; i++) if(a[i] == x) res = res + 1; return res; }
Schreiben Sie ein MIPS-Assembler-Programm zu machen, dass die Verwendung der Funktion count vor wie folgt:
Hard-code, die folgenden 10 Werte in ein array ein:
128, 10, 23, 12, 128, 9, 220, 46, 128, 5
Hard-code n = 10
Den Benutzer auffordern, einen Wert einzugeben, wie folgt: "Bitte geben Sie einen integer-Wert"
Lesen Sie den integer-Wert ein und speichern es (nennen wir es x)
Rufen Sie die Funktion zählen folgende Argumente: count(a, 10, x)
Ausgabe der Ergebnisse wie folgt: "Die Anzahl der Zeiten, die x in der Liste angezeigt wird, ist res mal"
Beenden Sie das Programm