Warum ist mein Assemblercode in MIPS falsch?

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)?

Ich bin mit der MIPS-Assemblersprache nicht vertraut, daher weiß ich nicht, ob Ihr Code korrekt ist, aber normalerweise gibt es viele verschiedene Möglichkeiten, ein einzelnes Problem zu lösen. Der eine Weg ist nicht unbedingt besser als der andere Weg.
Angenommen: Basisadresse von A = 28 und IJ = 3, also möchten wir auf das 3. Element aus dem Array A zugreifen. In diesem Fall ist die gewünschte Byteadresse 28 + 3 * 4 = 40, gemäß dem Buchlösungshandbuch die Byteadresse, auf die zugegriffen wird wird 28 +3 + 16 = 47 sein, dies ist nicht einmal eine Zahl, die durch 4 teilbar ist. Diese Antwort scheint also falsch zu sein
Die Antwort des Buches scheint mir auch falsch zu sein.

Antworten (2)

Die Buchlösung ist falsch:

sub $t0, $s3, $s4
add $t0, $s6, $t0
lw $t1, 16($t0)
sw $t1, 32($s7)

Die Verwendung von lwund swAnweisungen 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.

Es beantwortet eine andere Frage, also ist es immer noch falsch.