Ich habe angefangen, Montage zu studieren, und ich habe versucht, dieses Problem zu lösen:
Wie lautet der entsprechende MIPS-Assemblycode für die folgende C-Anweisung? Angenommen, die Variablen f, g, h, i und j sind den Registern $s0, $s1, $s2, $s3 bzw. $s4 zugewiesen. Angenommen, die Basisadressen der Arrays A und B befinden sich in den Registern $s6 bzw. $s7:
B[8] = A[i−j];
Quelle: Computerorganisation und -design, 5. Auflage .
Also habe ich das gemacht:
sub $t0, $s3, $s4 // temp = i - j
sll $t0, $t0, 2 // temp = temp*2^2= 4*temp
add $t0, $t0, $s6 // temp = &A[i-j]
lw $t1, 0($t0) // t1 = temp
sw $t1, 32 ($s7) // B[8] = t1 = temp = A[i-j]
Aber als ich mir das Lösungshandbuch des Buches ansah, um zu überprüfen, ob meine Antwort richtig ist, bekam ich Folgendes:
sub $t0, $s3, $s4
add $t0, $s6, $t0
lw $t1, 16($t0)
sw $t1, 32($s7)
Ich bin verwirrt. Wie kamen sie auf die dritte Aussage lw $t1, 16($t0)
?
Die Buchlösung ist falsch:
sub $t0, $s3, $s4
add $t0, $s6, $t0
lw $t1, 16($t0)
sw $t1, 32($s7)
Die Verwendung von lw
und sw
Anweisungen impliziert, dass die Arrays A und B 32 Bit groß sind, andernfalls würden Anweisungen wie lb/lbu, lh/lhu verwendet werden, um 8 oder 16 Bit breite Einheiten zu laden (oder LD, SD für 64-Bit-Maschinen). .
Die Adressberechnung berücksichtigt jedoch nicht die Größe der Elemente. Dadurch wird die Adressberechnung falsch.
Sie haben es richtig gemacht, indem Sie den Offset mit der sll-Anweisung in das Array skaliert haben.
Ich bin verwirrt. Wie kamen sie auf die dritte Aussage lw $t1, 16($t0) ?
Der Offset von 16 macht in diesem Zusammenhang keinen Sinn. Der Offset von 32 in der Store-Anweisung ist in Ordnung, da er Element 8 im B-Array direkt adressiert, wie es sollte.
Ich habe das gleiche Lösungshandbuch. Es ist nicht falsch, es beantwortet nur Frage 2.4.1. Die Frage, die Sie stellen, ist Übung 2.4, die nicht im Lösungshandbuch enthalten ist. Was du getan hast, ist richtig.
Jippie
Elbeherie
Benutzer253751